应用场景
公司有30员工,每个人工资计算方式不同。现在需要计算工资。
传统的方法:一个接口,30个实现类。
使用脚本引擎:编写一个xml文件,每人一个计算公式,使用的时候可以把公式加载到程序中,启动时使用脚本引擎调用相关的脚本,计算工资。
通过脚本引擎管理器,获得脚本引擎对象,执行相关代码
Warning: Nashorn engine is planned to be removed from a future JDK release
警告:计划从未来的JDK版本中删除Nashorn引擎
示例(1):在Java中执行JS代码
package cn.hanquan.rhino;import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;//测试脚本引擎执行JavaScript代码public class TestRhino {public static void main(String[] args) throws Exception {// 获得脚本引擎对象ScriptEngineManager sem = new ScriptEngineManager();ScriptEngine engine = sem.getEngineByName("javascript");// 定义变量,存储到引擎的上下文中engine.put("msg", "hello~world!");String str = "var user= {name:'HanQuan', age:29};";str += "print(user.name);";// 执行脚本engine.eval(str);}}
运行结果
HanQuan
示例(2):分别通过 JavaScript/Java 获取脚本引擎定义的msg变量、使用脚本引擎修改msg的内容
引擎,相当于连接JavaScript和Java的桥梁。存储到引擎的上下文中的变量msg
,既可以被JavaScript
操作,也可以被Java
操作
package cn.hanquan.rhino;import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;//测试脚本引擎执行JavaScript代码public class Demo1 {public static void main(String[] args) throws Exception {// 获得脚本引擎对象ScriptEngineManager sem = new ScriptEngineManager();ScriptEngine engine = sem.getEngineByName("javascript");// 定义变量msg,存储到引擎的上下文中engine.put("msg", "hello~world!");// 使用js修改msg内容engine.eval("msg='Hello,Are you Okayyyy'");// 分别通过 JavaScript/Java 获取msgengine.eval("print('通过JavaScript获取msg: '+msg);");System.out.println("通过Java获取msg:" + engine.get("msg"));}}
运行结果
通过JavaScript获取msg: Hello,Are you Okayyyy通过Java获取msg:Hello,Are you Okayyyy
示例(3):分别用JavaScript和Java,执行JavaScipt中的函数
package cn.hanquan.rhino;import javax.script.Invocable;import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;//测试脚本引擎执行JavaScript代码public class Demo2 {public static void main(String[] args) throws Exception {// 获得脚本引擎对象ScriptEngineManager sem = new ScriptEngineManager();ScriptEngine engine = sem.getEngineByName("javascript");// 定义函数engine.eval("function add(a,b){var sum=a+b; return sum;}");// 通过JavaScript执行函数engine.eval("print('通过JavaScript执行函数: ' + add(11,22));");// 通过Java执行函数Invocable jsInvoke = (Invocable) engine;Object res = jsInvoke.invokeFunction("add", new Object[] {44, 55 });System.out.println("通过Java执行函数: " + res);}}
运行结果
通过JavaScript执行函数: 33通过Java执行函数: 99.0
还可以导入其他Java包
运行结果
北京尚学堂清华大学北京大学
* 若想要深入了解 Rhino 细节,可以上 Rhino 官网,详细学习 Rhino 语法。
* 另外,还有很多用 Java 执行 JS 脚本的方法, Rhino 只是其中一种。
执行本地的JavaScript文件
JS代码
目录结构
Java代码