Scripting in Java
Aus Wirthi's Wiki
Seit der Java-Version 1.6 ist es es möglich, wird Scripting in Java direkt unterstützt. Basierend auf den Forderungen des Java Specification Request (JSR) 223 stellt Java eine Schnittstelle zur Verfügung, um Scriptsprachen anzubinden. Von den Scripts aus können auch Objekte in der Java-Umgebung manipuliert werden, so können etwa Daten verändert oder Methoden aufgerufen werden.
Basierend auf dieser Schnittstelle wurde bereits eine Vielzahl an Scriptsprachen an Java angebunden. Die am häufigsten genannte ist Javascript, daneben existieren aber bereits auch Implementierungen für Python, Ruby, XSLT, AWK und andere [1]. Der Vorteil an Javascript ist, dass im Java SDK standardmäßig eine Engine dafür enthalten ist, die "Rhino"-Engine aus dem Mozilla-Projekt [2].
Inhaltsverzeichnis |
[bearbeiten] Schnittstelle
[bearbeiten] Liste der verfügbaren Engines
Der ScriptEngineManager kann eine Liste der aktuell verfügbaren Engines liefern:
ScriptEngineManager engineMgr = new ScriptEngineManager();
List<ScriptEngineFactory> engines = engineMgr.getEngineFactories();
Iterator it = engines.iterator();
while(it.hasNext()) {
ScriptEngineFactory sef = (ScriptEngineFactory)it.next();
System.out.println("engine: " + sef.getEngineName());
}
[bearbeiten] Engine auswählen
Mittels des obigen Codes kann eine der verfügbaren Engines ausgewählt werden. Ebenso ist es möglich, die Engine direkt auszuwählen; der ScriptEngineManager stellt dafür folgende Funktionen zur Verfügung:
- getEngineByExtension(String extension)
- getEngineByMimeType(String mimeType)
- getEngineByName(String shortName)
ScriptEngine engine = engineMgr.getEngineByName("JavaScript");
[bearbeiten] Script-Code übergeben
Um der Engine Script-Code zu übergeben wird die Funktion eval genutzt. Dieser kann ein String oder ein Reader (etwa, um eine Datei einzulegen) übergeben werden:
engine.eval("print('hello, world!')");
FileInputStream fin = new FileInputStream(new File("test.js"));
Reader reader = new InputStreamReader(fin);
engine.eval(reader);
[bearbeiten] Daten übergeben
Auf Daten der Java-VM kann auch von den Scripts aus zugegriffen werden. Diese müssen dazu an die Engine "gebunden" werden. Dafür stellt ScriptEngine die Funktion put zur Verfügung, mittels derer Daten an das Script übergeben werden können. Der erste Paramete ist der, unter dem das Objekt im Scriptcode ansprechbar sein soll, der zweite Parameter ist das Objekt selber:
String javaString = "hallo";
engine.put("javaObjekt", javaString);
Im Script kann anschließend auf das Objekt "javaObjekt" zugegriffen werden. Dabei können nicht nur dessen Daten verändert werden, sondern etwa auch Funktionen des Objektes aufgerufen werden.
[bearbeiten] Funktionen im Script aufrufen
Wenn die Engine das Interface Invocable implementiert, können Funktionen des übergebenen Scripts von Java aus direkt aufgerufen werden:
Invocable invocableEngine = (Invocable)engine;
invocableEngine.invoke("myJavascriptFunction");
Neben dem Namen der aufzurufenden Funktion kann dabei eine beliebige Anzahl an Parametern übergeben werden. Die Anzahl muss sich natürlich mit der von der Script-Funktion erwarteten Anzahl decken.
[bearbeiten] Weblinks
- https://scripting.dev.java.net/
- http://www.mozilla.org/rhino/ Standard-JavaScript-Engine im Java SDK
