我可以使用 Nashorn 在新引擎作用域中调用函数吗?

Can I invoke a function in a new engine scope with Nashorn?

本文关键字:作用域 调用 函数 引擎 可以使 Nashorn 新引擎 我可以      更新时间:2023-09-26

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异常。

根据您的情况,您可能需要重新设置原始上下文!