2015-08-27 8 views
6

Ich habe den folgenden Code, der funktioniert:Wie rufen Sie eine Methode in einem Nashorn CompiledScript auf?

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

jsEngine.invokeMethod(jsEngine.eval("foo"), "bar"); 

aber ich vorkompilierte Skript verwenden, tun wollen, damit ich es nicht laufen jedes Mal, ich brauche das Skript auswerten müssen, um, also bin ich versuchen;

aber ich bin mir nicht sicher, was ich mit CompiledScript machen soll, wie rufe ich eine Methode auf? es implementiert nichts anderes als eval() scheinbar: https://docs.oracle.com/javase/8/docs/api/javax/script/CompiledScript.html

+0

Ich denke, hier mein Ansatz falsch sein könnte, so schrieb ich eine grundlegende Frage: http://stackoverflow.com/ Fragen/32252843/re-using-a-nashorn-scriptengine – Pablo

Antwort

4

Sie nennen die Methode?

Hier sind einige Beispiele: http://www.programcreek.com/java-api-examples/index.php?api=javax.script.CompiledScript


Beispiel:

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

Wie nennt man die Methode? CompiledScript implementiert nicht Invocable. – Pablo

+0

Es gibt keine einzige Erwähnung von invokeMethod oder invokeFunction auf der Seite, mit der Sie verbunden sind. – Pablo

+0

Ich aktualisiere Beispiel, ich habe ähnliche Ansatz zuvor verwendet, aber ich kann sagen, es ist ein bisschen unintuitiv. Habe die neueste Skript-Engine nicht verwendet, aber ich gehe davon aus, dass es in ähnlicher Weise funktioniert. – Margus