Javascript 如何在Nashorn编译脚本中调用方法?

Javascript 如何在Nashorn编译脚本中调用方法?,javascript,java,nashorn,scriptengine,Javascript,Java,Nashorn,Scriptengine,我有以下有效的代码: ScriptEngine jsEngine = ScriptEngineManager.new().getEngineByName("nashorn"); jsEngine.eval("some script"); jsEngine.invokeMethod(jsEngine.eval("foo"), "bar"); 但是我想使用一个预编译的脚本,这样我就不必在每次需要运行它时都对脚本求值,所以我正在尝试 ScriptEngine jsEngine = ScriptEn

我有以下有效的代码:

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

jsEngine.invokeMethod(jsEngine.eval("foo"), "bar");
但是我想使用一个预编译的脚本,这样我就不必在每次需要运行它时都对脚本求值,所以我正在尝试

ScriptEngine jsEngine = ScriptEngineManager.new().getEngineByName("nashorn");
CompiledScript compiledJS = jsEngine.compile("some script");
但我不知道如何处理CompiledScript,如何调用方法?它只实现eval()显然:

调用该方法吗

以下是几个例子:


例如:

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");
    }
}
你称之为方法

以下是几个例子:


例如:

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");
    }
}

你怎么称呼这个方法?CompiledScript没有实现Invocable。在您链接到的页面中没有提到invokeMethod或invokeFunction。我更新了示例,以前使用过类似的方法,但我可以说它有点不直观。我没有使用最新的脚本引擎,但我假设它以类似的方式工作?每次我想再次调用函数/方法时,是否需要创建新绑定?调用该方法会修改ScriptEngine本身吗?1)CompiledScript会消除一些开销,如果您反复运行它,那么速度会更快。调用可以发生在脚本内部,尤其是在递归函数的情况下。它不是一个不变性保证,而是一个常量——如果需要更改脚本,则需要重新编译+不,您也可以调用“cscript.eval();”,但是如果您想使用不同的可变参数,那么可以。每次重新编译都没有意义,因为它有更大的开销。3) 它将改变环境。如果您的意思是可以使用不同的绑定重用脚本引擎,那么如何调用该方法?CompiledScript没有实现Invocable。在您链接到的页面中没有提到invokeMethod或invokeFunction。我更新了示例,以前使用过类似的方法,但我可以说它有点不直观。我没有使用最新的脚本引擎,但我假设它以类似的方式工作?每次我想再次调用函数/方法时,是否需要创建新绑定?调用该方法会修改ScriptEngine本身吗?1)CompiledScript会消除一些开销,如果您反复运行它,那么速度会更快。调用可以发生在脚本内部,尤其是在递归函数的情况下。它不是一个不变性保证,而是一个常量——如果需要更改脚本,则需要重新编译+不,您也可以调用“cscript.eval();”,但是如果您想使用不同的可变参数,那么可以。每次重新编译都没有意义,因为它有更大的开销。3) 它将改变环境。如果您的意思是我认为我的方法可能是错误的,那么您可以使用不同绑定重用脚本引擎,因此我写了一个更基本的问题:我认为我的方法可能是错误的,所以我写了一个更基本的问题: