代码直接可以放在main函数里试一试
注意
引用类型的值会被js直接变更,值类型不会
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
//动态声明对象参数,匿名类型
var v = new Object() {
public String a = "2000";
};
//转换为json对象传入,匿名类型不能直接传入,否则获取不到值
JSONObject j = (JSONObject) JSON.toJSON(v);
//声明整型变量,非引用类型,看是否会被js改变
var i = 1;
//将Java变量放入js上下文
engine.put("javaVar", j);
engine.put("i", i);
try {
//js内改变Java变量
var res = engine.eval("javaVar.a+=\"ddd\";i+=1;");
//js内调用看是否改变成功
res = engine.eval("print(javaVar.a,i)");
//通过函数的方式返回给Java变量,此处只是函数声明,返回为null
//想直接获取,可以直接写res=engine.eval("javaVar")
engine.eval("function d(){return {a:javaVar.a,i:i}}");
Invocable invocable = (Invocable) engine;
//调用js函数,获取返回值
var jres = (ScriptObjectMirror) invocable.invokeFunction("d");
System.out.println("获取js变更后的整型参数");
System.out.println(jres.get("i"));
System.out.println("java中的整型变量i");
System.out.println(i);//整型值未被js改变
var jvar = engine.get("javaVar");
System.out.println("获取js变更后的对象参数");
System.out.println(jvar);
System.out.println("java中的对象变量j");
System.out.println(j);//对象变量的属性被改变
} catch (Exception ex) {
System.out.println(ex);
}
依赖的js引擎
<dependency>
<groupId>org.openjdk.nashorn</groupId>
<artifactId>nashorn-core</artifactId>
<version>15.4</version>
</dependency>