2015-08-27 26 views
6

ho il seguente codice che funziona:Come si richiama un metodo in Nashorn CompiledScript?

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

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

ma voglio fare utilizzare uno script pre-compilato in modo da non devo valutare il copione ogni volta che ho bisogno di farlo funzionare, quindi sono provando;

ScriptEngine jsEngine = ScriptEngineManager.new().getEngineByName("nashorn"); 
CompiledScript compiledJS = jsEngine.compile("some script"); 

ma poi non sono sicuro di cosa fare con CompiledScript, come posso richiamare un metodo? non implementa nient'altro che eval() apparentemente: https://docs.oracle.com/javase/8/docs/api/javax/script/CompiledScript.html

+0

penso che il mio approccio qui potrebbe essere sbagliato, così ho scritto una domanda più fondamentale: http://stackoverflow.com/ questions/32252843/re-using-a-nashorn-scriptengine – Pablo

risposta

4

Si chiama il metodo?

Ecco alcuni esempi: http://www.programcreek.com/java-api-examples/index.php?api=javax.script.CompiledScript


Esempio:

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

come si chiama il metodo? CompiledScript non implementa Invocation. – Pablo

+0

Non c'è una singola menzione di invokeMethod o invokeFunction nella pagina a cui sei collegato. – Pablo

+0

Ho aggiornato l'esempio, ho usato un approccio simile prima, tuttavia posso dire che è un po 'non intuitivo. Non ho usato l'ultimo motore di script, ma presumo che funzioni in modo simile. – Margus