问题描述
我有 2 个变量要使用 engine.eval()-java8 中的 nashorn javascript 引擎添加。? 我使用过这样的代码:
ScriptEngineManager sem=new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("nashorn");
Integer sum = 20;
Integer var2=30;
try {
sum=(Integer)engine.eval("sum+var2");
} catch(Exception e) {
System.out.println("Error executing script: "+ e.getMessage());
}
eval 函数只接受字符串参数。所以它显示错误。如何执行此操作?
解决方法
Nashorn ScriptEngine 是一个独立的运行时。除非明确指定,否则它不了解其范围之外的数据。
这里的 sum 和 var2 超出了 Nashorn 的范围。您可以通过多种方法将此数据传递给 Nashorn。其中之一是使用绑定。
示例代码:
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("nashorn");
Integer sum = 20;
Integer var2 = 30;
try {
Bindings bindings = engine.createBindings();
bindings.put("sum",20);
bindings.put("var2",30);
double result = (double) engine.eval("sum+var2",bindings);
System.out.println(result);
} catch (Exception e) {
System.out.println("Error executing script: " + e.getMessage());
}
从整数到双精度的类型转换是一个细微差别解释here。
但是这种脚本评估是相当有限的。您可以使用 Invocable api 来调用 javascript 函数。这 tutorial 是一个很好的起点。