我在Java中使用了以下代码,其中包含Rhino
JavaScript引擎:
@Test
public void testRhino() throws ScriptException {
final ScriptEngineManager factory = new ScriptEngineManager();
final ScriptEngine engine = factory.getEngineByName("rhino");
final String raw = "I am the raw value injected";
final ScriptContext ctx = new SimpleScriptContext();
ctx.setAttribute("raw", raw, ScriptContext.ENGINE_SCOPE);
String script = "var result = 'I am a result';";
script += "java.lang.System.out.println(raw);";
script += "'I am a returned value';";
final Object res = engine.eval(script, ctx);
System.out.println(ctx.getAttribute("result"));
System.out.println(res);
}
脚本的输出(使用
Rhino
)为:I am the raw value injected
I am a result
I am a returned value
在 Nashorn
JavaScript 引擎中,我无法得到 result
的值:
@Test
public void testNashorn() throws ScriptException {
final ScriptEngineManager factory = new ScriptEngineManager();
final ScriptEngine engine = factory.getEngineByName("nashorn");
final String raw = "I am the raw value injected";
final ScriptContext ctx = new SimpleScriptContext();
ctx.setAttribute("raw", raw, ScriptContext.ENGINE_SCOPE);
String script = "var result = 'I am a result';";
script += "java.lang.System.out.println(raw);";
script += "'I am a returned value';";
final Object res = engine.eval(script, ctx);
System.out.println(ctx.getAttribute("result"));
System.out.println(res);
}
返回值
I am the raw value injected
null
I am a returned value
我该如何使用nashorn引擎访问ScriptContext的result变量的值?
NashornScriptEngine#createBindings()
方法返回一个new SimpleBindings()
,如果全局引擎被设置,则返回createGlobalMirror()
。无论是使用-Dnashorn.args=--global-per-engine
运行,还是在创建引擎之前添加System.setProperty("nashorn.args", "--global-per-engine");
这一行,都会导致ctx.getAttribute("result")
再次返回null
。解决 Nashorn 全局问题是将 Nashorn 嵌入 Java 应用程序时最大的痛点之一。 - AJNeufeld