我可以使用 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
异常。
根据您的情况,您可能需要重新设置原始上下文!
相关文章:
- 调用私有作用域
- Javascript作用域和Ajax调用;工作不正常
- 直接在DOM事件处理程序中调用作用域函数的最短方法是什么
- AngularJS:如何调用指令中定义的函数'控制器的作用域
- 从匿名函数调用mouseover函数时失去作用域
- Javascript-在全局作用域中调用本地函数/属性
- 从$http.get调用更新Angular作用域变量
- $uibModal从windowTemplate调用作用域函数
- 函数内部的作用域调用函数
- 角度:创建可以调用作用域函数的自定义指令
- 从另一个文件调用时出现Javascript作用域错误
- 从对象中调用的函数是否可以访问该对象的作用域
- AngularJS:从作用域调用$watchGroup
- 如何将从外部作用域调用的方法存根到被测函数
- AngularJs指令:在模板中从父作用域调用方法
- AngularJS从指令中的祖先作用域调用方法
- 从作用域调用控制器方法
- 从另一个作用域调用函数
- 如何从角作用域调用外部控制器
- Javascript闭包:动态定义函数,从当前作用域调用方法