我可以使用 Nashorn 在新引擎范围内调用函数吗?
Can I invoke a function in a new engine scope with Nashorn?
Nashorn 允许我在新范围内计算 JavaScript,如下所示:
public Object evalInNewScope(String code, Bindings bindings) throws Exception {
ScriptContext context = new SimpleScriptContext();
context.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
return engine.eval(code, context);
}
这对线程安全非常有用:引擎实例可以跨线程重复使用,每个线程都可以使用线程特定的绑定进行自己的调用。
但是,我还没有找到 Invocable#invokeFunction(String, Object...)
的类似功能。
有谁知道我怎样才能做我想做的事?这种不对称有充分的理由吗?
invokeFunction
仅从当前上下文调用函数,不能直接提供上下文。
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
ScriptContext ctx = new SimpleScriptContext();
ctx.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE);
engine.eval("function hello() { return 'Hello!'; }", ctx);
engine.setContext(ctx);
((Invocable) engine).invokeFunction("hello");
删除 engine.setContext(ctx)
行将导致 java.lang.NoSuchMethodException: No such function hello
异常。
根据您的情况,您可能需要重新设置原始上下文!
Nashorn 允许我在新范围内计算 JavaScript,如下所示:
public Object evalInNewScope(String code, Bindings bindings) throws Exception {
ScriptContext context = new SimpleScriptContext();
context.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
return engine.eval(code, context);
}
这对线程安全非常有用:引擎实例可以跨线程重复使用,每个线程都可以使用线程特定的绑定进行自己的调用。
但是,我还没有找到 Invocable#invokeFunction(String, Object...)
的类似功能。
有谁知道我怎样才能做我想做的事?这种不对称有充分的理由吗?
invokeFunction
仅从当前上下文调用函数,不能直接提供上下文。
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
ScriptContext ctx = new SimpleScriptContext();
ctx.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE);
engine.eval("function hello() { return 'Hello!'; }", ctx);
engine.setContext(ctx);
((Invocable) engine).invokeFunction("hello");
删除 engine.setContext(ctx)
行将导致 java.lang.NoSuchMethodException: No such function hello
异常。
根据您的情况,您可能需要重新设置原始上下文!