Java如何执行js脚本

107 阅读1分钟

代码直接可以放在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>