2015-08-27 9 views
6

Ben işleri aşağıdaki kod: ama ben Komut dosyasını bunu çalıştırmak için gereken her zaman değerlendirmek zorunda kalmamak önceden derlenmiş komut dosyası kullanmak yapmak istiyorumNashorn CompiledScript'te bir yöntemi nasıl çağırıyorsunuz?

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

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

, bu yüzden ben çalışırken;

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

ama sonra CompiledScript ile ne emin değilim, nasıl bir yöntemi çağırmak mı? https://docs.oracle.com/javase/8/docs/api/javax/script/CompiledScript.html

+0

Benim burada yaklaşım yanlış olabileceğini düşünüyorum, bu yüzden daha temel bir soru yazdı: http://stackoverflow.com/ sorular/32252843/re-using-a-nashorn-scriptengine – Pablo

cevap

4

Sen yöntemini çağırın: Bu görünüşte eval daha başka bir şey() uygulamıyor?

İşte birkaç örnek: http://www.programcreek.com/java-api-examples/index.php?api=javax.script.CompiledScript


Örnek:

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

yöntemi nasıl çağırırsınız? CompiledScript, Invocable'ı uygulamıyor. – Pablo

+0

Bağlandığınız sayfada invokeMethod veya invokeFunction hakkında tek bir söz yok. – Pablo

+0

Örneği güncelledim, daha önce benzer bir yaklaşım kullandım, ancak bunun biraz bilinçsiz olduğunu söyleyebilirim. En son komut dosyası altyapısını kullanmadım, ancak sanırım benzer şekilde çalışıyor. – Margus

İlgili konular