2012-06-20 16 views
22

Angenommen, ich habe ein JavascriptBind Methodenaufruf in Skript JavaScript in Java Scripting

function js_main(args){ 
    /* some code */ 
    var x = api_method1(some_argument); 
    /* some code */ 
} 

-Datei und ich versuche, es mit javax.scripting die übliche Weise

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine engine = manager.getEngineByName("javascript"); 
engine.eval(...); 

Nun ist die Ich möchte zu laufen Behandle den Aufruf an api_method1 in Javascript mit meiner Java-Klasse. Ich möchte eine Art von Mapping habe/Bindung von Anrufen das heißt jedes Mal das Skript api_method1(arg) ruft eine Methode

public Object api_method1(Object arg){ ... } 

(in der gleichen Klasse wie der Motor platziert) aufgerufen werden würde.

Kann ich das erreichen?

Antwort

15
  1. Verwenden Sie engine.createBindings(), um ein Bindings-Objekt zu erstellen;
  2. setzten ein Objekt mit einem gewissen Namen Ihre Methode in die Bindungen aussetzt:

    Bindings b = engine.createBindings(); 
    b.put("api", yourApiObject); 
    engine.setBindings(b, ScriptContext.ENGINE_SCOPE); 
    
  3. Dann in JavaScript wird es ein globales "api" Objekt sein, das Sie anrufen:

    api.method1("foo", 14, "whatever"); 
    

Die Anlage ist einfach zu bedienen, aber seien Sie vorsichtig mit dem, was Sie hin und her gehen; Es macht nicht so viel, um JavaScript-Typen in Java-Typen zu konvertieren.

+0

Was ist mit Marshalling Daten zu/von der Methode (neben den Primitiven)? – emesx

+1

Um Daten für andere als primitive Daten vor- und zurückzugeben, können Sie JSON verwenden. Ihr Java-Code kann JSON mithilfe einer beliebigen JSON-Bibliothek serialisieren/deserialisieren. – sperumal

+1

Sie sind ziemlich selbständig dafür. Sie könnten in JSON serialisieren (einfach aus JavaScript) und dann in Java deserialisieren (weniger einfach, aber machbar). Oder Sie können verschiedene Dienstprogramme verfügbar machen, um andere Java-Objekttypen zusammenzufügen. – Pointy