Как вы вызываете метод в Nashorn CompiledScript?
У меня есть следующий код, который работает:
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(): https://docs.oracle.com/javase/8/docs/api/javax/script/CompiledScript.html
1 ответ
Вы называете метод?
Вот несколько примеров: 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");
}
}