80 脚本引擎——js脚本引擎
脚本引擎管理工具
java提供了一个脚本引擎管理工具,从这个工具可以获得各种脚本语言的脚本引擎,如js、python等。我们可以通过脚本引擎,来调用已经写好的脚本文件。相当的方便。
我们可以使用:new ScriptEngineManager()获取一个脚本引擎管理工具对象。
然后,可以通过getEngineByName(scriptName)的方式得到我们想要的脚本引擎。
//获取脚本引擎管理器 ScriptEngineManager sem = new ScriptEngineManager(); //获取js脚本引擎 ScriptEngine engine = sem.getEngineByName("js");
JS脚本引擎
js脚本引擎可以存储由java程序传入的js数据。如java程序通过put方法传入一个js属性,我们就可以用get方法得到这个属性。同时js脚本引擎也可以直接执行java程序传入的js代码。更为常用的是,js脚本引擎可以以Reader流的方式读取一个js文件,并运行它。下面我们来看看它的常见用法。
put方法
put(key,value)方法可以向js脚本引擎中添加js属性。
engine.put("name", "lily");
get方法
Object get(key)方法可以读取存储在引擎中的js属性。
System.out.println(engine.get("name")); //运行结果 lily
eval方法
eval添加进的无论是String类型的js代码还是以Reader传入js文件,都会执行并存储在js脚本引擎中。
eval(String script)
以java字符串的方式传入js脚本引擎中并执行。
String aFunction = "function ff(){print('what hell?due?');}ff();"; engine.eval(aFunction); //运行结果 what hell?due?
eval(Reader)
以Reader流的方式传入一个js文件到js脚本引擎并执行
//直接执行现有的js文件 //将加载得到的URL对象获取字符输入流 FileReader fr = new FileReader("c:/newFolder/a.js"); //通过engine.eval(Reader)执行js文件 engine.eval(fr); //关闭流 fr.close();
将js引擎作为一个java接口使用
我们可以将脚本引擎转为一个java的接口来调用保存在其中的js函数。
注意:当向js函数中传递传输时,传递的是Object对象。它是多值传参,可以使用Object数组的方式进行多值传参(将参数写在一个Object数组中,在单独传入这个数组),也可以直接传递多个Object对象。
//将引擎作为借口调用引擎中存储的js代码中的函数 //先添加一个函数 engine.eval("function returnWhatYouInput(a){return a;}"); //将engine转为Invocable的引用 Invocable jsInvoke = (Invocable)engine; Object result = jsInvoke.invokeFunction("returnWhatYouInput", new Object[]{"sick"});//多值传参Object类型,如只传一个可以这样写,也可以传已经创建好的Object引用 System.out.println(result);
js引擎中引入Java工具的方法
//js脚本中引入java包的方法 engine.eval("var list = java.util.Arrays.asList(\"你\",\"我\")");//就是这一行,示例为传入java.util.Arrays工具 List<String> list = (List<String>) engine.get("list"); for(String s : list){ System.out.println(s); }
完整代码
package _20200105_ScriptEngine; import java.io.FileReader; import java.util.List; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class Demo02 { public static void main(String[] args) throws Exception{ //获取脚本引擎管理器 ScriptEngineManager sem = new ScriptEngineManager(); //获取js脚本引擎 ScriptEngine engine = sem.getEngineByName("js"); //向引擎中添加js代码 engine.put("name", "lily"); //直接执行java字符串类型的js代码 String aFunction = "function ff(){print('what hell?due?');}ff();"; engine.eval(aFunction); //读取引擎中存储的js代码中的属性 System.out.println(engine.get("name")); //将引擎作为借口调用引擎中存储的js代码中的函数 //先写一个函数 engine.eval("function returnWhatYouInput(a){return a;}"); //将engine转为Invocable的引用 Invocable jsInvoke = (Invocable)engine; Object result = jsInvoke.invokeFunction("returnWhatYouInput", new Object[]{"sick"});//多值传参Object类型,如只传一个可以这样写,也可以传已经创建好的Object引用 System.out.println(result); //js脚本中引入java包的方法 engine.eval("var list = java.util.Arrays.asList(\"你\",\"我\")"); List<String> list = (List<String>) engine.get("list"); for(String s : list){ System.out.println(s); } //直接执行现有的js文件 //将加载得到的URL对象获取字符输入流 FileReader fr = new FileReader("c:/newFolder/a.js"); //通过engine.eval(Reader)执行js文件 engine.eval(fr); //关闭流 fr.close(); } }
运行结果
其中1120是js文件中的一个属性。
what hell?due? lily sick 你 我 invoke js file:7 1120