标签:保存 sem new pac java接口 接口 pytho string demo
java提供了一个脚本引擎管理工具,从这个工具可以获得各种脚本语言的脚本引擎,如js、python等。我们可以通过脚本引擎,来调用已经写好的脚本文件。相当的方便。
我们可以使用:new ScriptEngineManager()获取一个脚本引擎管理工具对象。
然后,可以通过getEngineByName(scriptName)的方式得到我们想要的脚本引擎。
//获取脚本引擎管理器
ScriptEngineManager sem = new ScriptEngineManager();
//获取js脚本引擎
ScriptEngine engine = sem.getEngineByName("js");
js脚本引擎可以存储由java程序传入的js数据。如java程序通过put方法传入一个js属性,我们就可以用get方法得到这个属性。同时js脚本引擎也可以直接执行java程序传入的js代码。更为常用的是,js脚本引擎可以以Reader流的方式读取一个js文件,并运行它。下面我们来看看它的常见用法。
put(key,value)方法可以向js脚本引擎中添加js属性。
engine.put("name", "lily");
Object get(key)方法可以读取存储在引擎中的js属性。
System.out.println(engine.get("name"));
//运行结果
lily
eval添加进的无论是String类型的js代码还是以Reader传入js文件,都会执行并存储在js脚本引擎中。
以java字符串的方式传入js脚本引擎中并执行。
String aFunction = "function ff(){print(‘what hell?due?‘);}ff();";
engine.eval(aFunction);
//运行结果
what hell?due?
以Reader流的方式传入一个js文件到js脚本引擎并执行
//直接执行现有的js文件
//将加载得到的URL对象获取字符输入流
FileReader fr = new FileReader("c:/newFolder/a.js");
//通过engine.eval(Reader)执行js文件
engine.eval(fr);
//关闭流
fr.close();
我们可以将脚本引擎转为一个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包的方法
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
标签:保存 sem new pac java接口 接口 pytho string demo
原文地址:https://www.cnblogs.com/Scorpicat/p/12153009.html