2016-03-08 26 views
0

犀牛讓我在一個新的範圍評估的JavaScript,像這樣:我可以在Nashorn的新引擎範圍中調用函數嗎?

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...)的類似功能。

有誰知道我該怎麼做我想做的?這種不對稱是否有充分的理由?

+0

是不是'ENGINE_SCOPE'的默認值?這就是示例8中提到的內容https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/prog_guide/api.html:*默認腳本上下文至少有一個作用域,由靜態字段ENGINE_SCOPE。* – Tunaki

+0

也許我不清楚:我想改變引擎作用域的綁定來調用函數,類似於我可以用eval()做的事情。 – Sebastian

回答

1

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例外。

根據您的情況,您可能需要重新設置原始上下文!

相關問題