如何调用Nashorn CompiledScript中的方法?

pup*_*eno 6 javascript java scriptengine nashorn

我有以下代码可行:

ScriptEngine jsEngine = ScriptEngineManager.new().getEngineByName("nashorn");
jsEngine.eval("some script");

jsEngine.invokeMethod(jsEngine.eval("foo"), "bar");
Run Code Online (Sandbox Code Playgroud)

但我想使用预编译的脚本,所以每次我需要运行它时都不必评估脚本,所以我正在尝试;

ScriptEngine jsEngine = ScriptEngineManager.new().getEngineByName("nashorn");
CompiledScript compiledJS = jsEngine.compile("some script");
Run Code Online (Sandbox Code Playgroud)

但后来我不知道如何处理CompiledScript,我该如何调用方法呢?它显然没有实现除eval()以外的任何东西:https://docs.oracle.com/javase/8/docs/api/javax/script/CompiledScript.html

Mar*_*gus 4

你调用方法?

以下是一些示例:http://www.programcreek.com/java-api-examples/index.php ?api=javax.script.CompiledScript


例子:

import java.util.*;
import javax.script.*;

public class TestBindings {
    public static void main(String args[]) throws Exception {
        String script = "function doSomething() {var d = date}";
        ScriptEngine engine =  new ScriptEngineManager().getEngineByName("JavaScript");
        Compilable compilingEngine = (Compilable) engine;
        CompiledScript cscript = compilingEngine.compile(script);

        //Bindings bindings = cscript.getEngine().createBindings();
        Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
        for(Map.Entry me : bindings.entrySet()) {
            System.out.printf("%s: %s\n",me.getKey(),String.valueOf(me.getValue()));
        }
        bindings.put("date", new Date());
        //cscript.eval();
        cscript.eval(bindings);

        Invocable invocable = (Invocable) cscript.getEngine();
        invocable.invokeFunction("doSomething");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 那么,您在 ScriptEngine 中调用 invokeFunction,为什么还需要 CompiledScript?每次我想再次调用函数/方法时是否都需要创建新的绑定?调用该方法会修改ScriptEngine本身吗? (2认同)