使用绑定进行评估时 Nashorn 找不到函数
Nashorn does not find function when eval with bindings
当我评估有或没有绑定的 nashorn 脚本时,有一个奇怪的区别:没有绑定,调用函数没有问题,但有了绑定,函数就找不到了。这是一个例子:
public class SimpleNashornTester {
public static void main(String[] args) throws ScriptException, NoSuchMethodException {
ScriptEngine jsEngine = new ScriptEngineManager().getEngineByName("nashorn");
Compilable jsCompilable = (Compilable) jsEngine;
Invocable jsInvocable = (Invocable) jsEngine;
ScriptContext scriptCtxt = new SimpleScriptContext();
Bindings engineScope = scriptCtxt.getBindings(ScriptContext.ENGINE_SCOPE);
CompiledScript jsScript = jsCompilable.compile("function definition() {print(\"Hello\")}");
jsScript.eval(engineScope); // no error with jsScript.eval() !
jsInvocable.invokeFunction("definition", new Object[] {});
}
}
这会产生错误:
Exception in thread "main" java.lang.NoSuchMethodException: No such function definition
at jdk.nashorn.api.scripting.ScriptObjectMirror.callMember(ScriptObjectMirror.java:204)
在脚本的评估中没有参数 engineScope 找到并调用该函数。任何人都可以解释这种差异吗?如何在不出错的情况下使用绑定?
您正在使用新的 ScriptContext 及其关联的 ENGINE_SCOPE
绑定来编译脚本。 invokeFunction
/invokeMethod
使用默认的 ScriptContext(及其关联的 ENGINE_SCOPE
绑定)来搜索函数。每个不同的 ENGINE_SCOPE
绑定都与其自己的 ECMAScript 全局对象(以及它自己的 ECMAScript 全局对象)相关联。
因此,您可以通过
修复您的程序
在调用之前将默认上下文更改为新上下文:
// change the default ScriptContext
jsEngine.setContext(scriptCtxt);
jsInvocable.invokeFunction("definition", new Object[] {});
编译后的脚本也使用默认的 ScriptContext。如:
ScriptContext scriptCtxt = jsEngine.getContext(); // new SimpleScriptContext();
当我评估有或没有绑定的 nashorn 脚本时,有一个奇怪的区别:没有绑定,调用函数没有问题,但有了绑定,函数就找不到了。这是一个例子:
public class SimpleNashornTester {
public static void main(String[] args) throws ScriptException, NoSuchMethodException {
ScriptEngine jsEngine = new ScriptEngineManager().getEngineByName("nashorn");
Compilable jsCompilable = (Compilable) jsEngine;
Invocable jsInvocable = (Invocable) jsEngine;
ScriptContext scriptCtxt = new SimpleScriptContext();
Bindings engineScope = scriptCtxt.getBindings(ScriptContext.ENGINE_SCOPE);
CompiledScript jsScript = jsCompilable.compile("function definition() {print(\"Hello\")}");
jsScript.eval(engineScope); // no error with jsScript.eval() !
jsInvocable.invokeFunction("definition", new Object[] {});
}
}
这会产生错误:
Exception in thread "main" java.lang.NoSuchMethodException: No such function definition
at jdk.nashorn.api.scripting.ScriptObjectMirror.callMember(ScriptObjectMirror.java:204)
在脚本的评估中没有参数 engineScope 找到并调用该函数。任何人都可以解释这种差异吗?如何在不出错的情况下使用绑定?
您正在使用新的 ScriptContext 及其关联的 ENGINE_SCOPE
绑定来编译脚本。 invokeFunction
/invokeMethod
使用默认的 ScriptContext(及其关联的 ENGINE_SCOPE
绑定)来搜索函数。每个不同的 ENGINE_SCOPE
绑定都与其自己的 ECMAScript 全局对象(以及它自己的 ECMAScript 全局对象)相关联。
因此,您可以通过
修复您的程序在调用之前将默认上下文更改为新上下文:
// change the default ScriptContext jsEngine.setContext(scriptCtxt); jsInvocable.invokeFunction("definition", new Object[] {});
编译后的脚本也使用默认的 ScriptContext。如:
ScriptContext scriptCtxt = jsEngine.getContext(); // new SimpleScriptContext();