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相关推荐

  1. ScriptEngine--Java动态执行JS脚本

    ScriptEngine--Java动态执行JS脚本 简介 Eval(String script) 描述 实例代码 Put() and Get() 描述 实例代码 CompiledScript 描述 ...

  2. HtmlUnit动态执行js函数

    功能:动态指定js函数,实际上这个效果不是很有用,这里就做一个记录而已,参考代码如下: package com; import com.gargoylesoftware.htmlunit.Browse ...

  3. JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。

    JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Java中直接调用js代码 不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: " ...

  4. oracle中执行动态sql语句吗,oracle中有没有可动态执行sql语句的函数

    oracle中有没有可动态执行sql语句的函数 关注:233  答案:2  手机版 解决时间 2021-03-05 15:53 提问者祗剩寂寞 2021-03-04 22:38 oracle中有没有可 ...

  5. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 动态拦截函数 | 动态获取 MetaClass 中的方法 | evaluate 方法执行Groovy脚本 )

    文章目录 一.基础示例 二.根据字符串动态获取 MetaClass 中的方法 二.使用 evaluate 执行字符串形式的 Groovy 脚本 二.完整代码示例 一.基础示例 定义类 Student ...

  6. python语言继承6.3节例6-1中的person_第6.3节 Python动态执行之动态编译的compile函数...

    Python支持动态代码主要三个函数,分别是compile.eval和exec.本节介绍compile函数的语法和相关使用.compile函数用来编译一段字符串的源码,将其编译为字节码或者AST(抽像 ...

  7. oracle 动态执行ddl语句,Oracle过程中执行动态SQL或DDL语句

    如果你用的是 Oracle 8i 及以上的版本,那简单,在过程中用 execute immediate sql_str 就行, sql_str 是一个拼凑的 SQL 语句, 如果你用的是 Oracle ...

  8. SQL Server 中 EXEC全称execute 与 SP_EXECUTESQL动态执行sql代码语句 的区别

    先睹为快 use cplvfx_DBdeclare @sqlStr nvarchar(max)set @sqlStr='select top 100 * from User'exec (@sqlStr ...

  9. 与动态执行的C# 代码进行通讯

    1.简介 能够动态执行 C# 代码是一件很酷的功能,比如,我们可以在控制台中输入一行 C# 代码,然后程序自动编译并执行这一行代码,将结果显示给我们.这差不多就是一个最简单的 C# 代码解释器了. 动 ...

最新文章

  1. 解决针对ubuntu11.04安装中文包后不能正常查看或使用pdf和Archiver的问题
  2. ML.NET Cookbook:(5)如何查看中间过程数据?
  3. 新增一个主键自增长_MyBatis 示例-主键回填
  4. [译]JavaScript 究竟是如何工作的?(第一部分)
  5. C语言 fwirte 函数 - C语言零基础入门教程
  6. 保护系统 用数据库加密实现数据安全
  7. jena 开发之 mysql数据导入_在Jena框架下基于MySQL数据库实现本体的存取操作
  8. atitit. java跟php的比较..为什么大企业喜欢java 而不是php
  9. Oracle9iClient简化版的安装与tnsnames配置,sqlplus的连接
  10. 教你电脑系统如何深度清理c盘空间
  11. 18. shell当中的until,until语法,无限循环,until示例
  12. c语言如何过滤掉电话号码前缀86,从iPhone拨打国际电话号码使用加前缀的简单方法 | MOS86...
  13. 360技术笔试+技术能力笔试(1)——能力测评
  14. 雷军的博客分享- 这局棋,我站在人工智能这边
  15. 李华明Himi浅谈游戏开发de自学历程!(仅供参考)
  16. 纯CSS实现瀑布流布局
  17. hc05刷hid固件_Arduino使用HC05蓝牙模块与手机连接
  18. Google Play应用商店开发者账号注册教程
  19. 利用poi读取word模板文件生成新的word文档
  20. Hadoop生态圈(十五)- HDFS Trash垃圾回收详解

热门文章

  1. Opencv实现利用滑动条来调整阈值
  2. 算法中的Strassen矩阵乘法
  3. php pacs,DICOM医学图像处理:WEB PACS初谈四,PHP DICOM Class – 只要踏出一步,路就在前方——zssure – CSDN博客...
  4. hadoop put命令的格式_HDFS常用命令
  5. task_struct 结构如何查看及分析
  6. 西安电子科技大学求职打点
  7. C语言操作符 进阶 (常见错误及细节)
  8. hwt字体转换ttf_五分钟教你弄懂了字体反爬是个啥
  9. eventfd(三)
  10. Java面试题及答案,mysql类型