JDK1.8中如何用ScriptEngine动态执行JS
JDK1.8中如何用ScriptEngine动态执行JS
jdk1.6开始就提供了动态脚本语言诸如JavaScript动态的支持。这无疑是一个很好的功能,毕竟Java的语法不是适合成为动态语言。而JDK通过执行JavaScript脚本可以弥补这一不足。这也符合“Java虚拟机不仅仅是Java一种语言的虚拟机“这一目标。
ScriptEngine功能强大,基本能实现笔者所能想到的Java与JavaScript交互的需求。而且十分的方便简洁。jdk1.8又对ScriptEngine接口进行了一定改变,因此,在jdk1.8能运行的代码,在1.6中可能会报错,反之亦然。
下面通过具体的代码讲解:
import java.util.Map;
import java.util.TreeMap;import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleBindings;import jdk.nashorn.api.scripting.ScriptObjectMirror;public class JSEngine {public static ScriptEngine engine;private static String str;//该函数测试Java获取JS变量值的能力public static void getJsValue() throws Exception{str = " var msg='hello'; "+ " var number = 123; "+ " var array=['A','B','C']; "+ " var json={ "+ " 'name':'pd', "+ " 'subjson':{ "+ " 'subname':'spd' "+ " ,'id':123 "+ " } "+ " }; ";//执行语句engine.eval(str);str="msg+=' world';number+=5";//再次执行engine.eval(str);//获取js变量msg(String类型)System.out.println(engine.get("msg"));//获取js变量msg(int类型)System.out.println(engine.get("number"));//获取js变量array(数组)ScriptObjectMirror array=(ScriptObjectMirror) engine.get("array");//getSlot(int index)函数用于获取下标为index的值System.out.println(array.getSlot(0));//获取js变量json(json类型)ScriptObjectMirror json=(ScriptObjectMirror) engine.get("json");//get(String key)函数用于键key的值System.out.println(json.get("name"));//获取js变量subjson(嵌套json类型)ScriptObjectMirror subjson=(ScriptObjectMirror)json.get("subjson");System.out.println(subjson.get("subname"));}//该函数测试Java与js对象public static void getObject() throws Exception{str = " var obj=new Object(); "+ " obj.info='hello world'; "+ " obj.getInfo=function(){ "+ " return this.info; "+ " }; ";engine.eval(str);//获取对象ScriptObjectMirror obj=(ScriptObjectMirror) engine.get("obj");//输出属性System.out.println(obj.get("info"));System.out.println(obj.get("getInfo"));str="obj.getInfo()";//执行方法System.out.println(engine.eval(str));}//java将变量导入js脚本public static void putValue() throws Exception{str="Math.pow(a,b)";Map<String, Object>input=new TreeMap<>();input.put("a",2);input.put("b",8);System.out.println(engine.eval(str,new SimpleBindings(input)));}//调用js函数public static void callJsFunction() throws Exception{engine.eval("function add (a, b) {return a+b; }");Invocable jsInvoke = (Invocable) engine;Object res = jsInvoke.invokeFunction("add", new Object[] { 10, 5 });System.out.println(res);}public static void main(String[] args) throws Exception {//获取js引擎实例ScriptEngineManager sem = new ScriptEngineManager();engine=sem.getEngineByName("javascript");getJsValue();getObject();putValue();callJsFunction();}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
是不是很有趣呢,注意的是ScriptObjectMirror类上市jdk1.8的类,该类对于先前版本的相应类进行了封装,使得代码很简单了。
JDK1.8中如何用ScriptEngine动态执行JS相关推荐
- ScriptEngine--Java动态执行JS脚本
ScriptEngine--Java动态执行JS脚本 简介 Eval(String script) 描述 实例代码 Put() and Get() 描述 实例代码 CompiledScript 描述 ...
- HtmlUnit动态执行js函数
功能:动态指定js函数,实际上这个效果不是很有用,这里就做一个记录而已,参考代码如下: package com; import com.gargoylesoftware.htmlunit.Browse ...
- JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。
JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Java中直接调用js代码 不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: " ...
- oracle中执行动态sql语句吗,oracle中有没有可动态执行sql语句的函数
oracle中有没有可动态执行sql语句的函数 关注:233 答案:2 手机版 解决时间 2021-03-05 15:53 提问者祗剩寂寞 2021-03-04 22:38 oracle中有没有可 ...
- 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 动态拦截函数 | 动态获取 MetaClass 中的方法 | evaluate 方法执行Groovy脚本 )
文章目录 一.基础示例 二.根据字符串动态获取 MetaClass 中的方法 二.使用 evaluate 执行字符串形式的 Groovy 脚本 二.完整代码示例 一.基础示例 定义类 Student ...
- python语言继承6.3节例6-1中的person_第6.3节 Python动态执行之动态编译的compile函数...
Python支持动态代码主要三个函数,分别是compile.eval和exec.本节介绍compile函数的语法和相关使用.compile函数用来编译一段字符串的源码,将其编译为字节码或者AST(抽像 ...
- oracle 动态执行ddl语句,Oracle过程中执行动态SQL或DDL语句
如果你用的是 Oracle 8i 及以上的版本,那简单,在过程中用 execute immediate sql_str 就行, sql_str 是一个拼凑的 SQL 语句, 如果你用的是 Oracle ...
- SQL Server 中 EXEC全称execute 与 SP_EXECUTESQL动态执行sql代码语句 的区别
先睹为快 use cplvfx_DBdeclare @sqlStr nvarchar(max)set @sqlStr='select top 100 * from User'exec (@sqlStr ...
- 与动态执行的C# 代码进行通讯
1.简介 能够动态执行 C# 代码是一件很酷的功能,比如,我们可以在控制台中输入一行 C# 代码,然后程序自动编译并执行这一行代码,将结果显示给我们.这差不多就是一个最简单的 C# 代码解释器了. 动 ...
最新文章
- 解决针对ubuntu11.04安装中文包后不能正常查看或使用pdf和Archiver的问题
- ML.NET Cookbook:(5)如何查看中间过程数据?
- 新增一个主键自增长_MyBatis 示例-主键回填
- [译]JavaScript 究竟是如何工作的?(第一部分)
- C语言 fwirte 函数 - C语言零基础入门教程
- 保护系统 用数据库加密实现数据安全
- jena 开发之 mysql数据导入_在Jena框架下基于MySQL数据库实现本体的存取操作
- atitit. java跟php的比较..为什么大企业喜欢java 而不是php
- Oracle9iClient简化版的安装与tnsnames配置,sqlplus的连接
- 教你电脑系统如何深度清理c盘空间
- 18. shell当中的until,until语法,无限循环,until示例
- c语言如何过滤掉电话号码前缀86,从iPhone拨打国际电话号码使用加前缀的简单方法 | MOS86...
- 360技术笔试+技术能力笔试(1)——能力测评
- 雷军的博客分享- 这局棋,我站在人工智能这边
- 李华明Himi浅谈游戏开发de自学历程!(仅供参考)
- 纯CSS实现瀑布流布局
- hc05刷hid固件_Arduino使用HC05蓝牙模块与手机连接
- Google Play应用商店开发者账号注册教程
- 利用poi读取word模板文件生成新的word文档
- Hadoop生态圈(十五)- HDFS Trash垃圾回收详解
热门文章
- Opencv实现利用滑动条来调整阈值
- 算法中的Strassen矩阵乘法
- php pacs,DICOM医学图像处理:WEB PACS初谈四,PHP DICOM Class – 只要踏出一步,路就在前方——zssure – CSDN博客...
- hadoop put命令的格式_HDFS常用命令
- task_struct 结构如何查看及分析
- 西安电子科技大学求职打点
- C语言操作符 进阶 (常见错误及细节)
- hwt字体转换ttf_五分钟教你弄懂了字体反爬是个啥
- eventfd(三)
- Java面试题及答案,mysql类型