2016-08-09 46 views
2

Ich habe einige Javascript-Code, der auf mein Objekt in Java Nashorn ausgeführt wird:Wie Nashorns `ScriptFunction` Callback von Java aufrufen?

scriptEngine.eval("my.fn(function(a,b) {...}"); 

I Methode fn in meiner Klasse erstellen können, die die ScriptFunction erhält, aber ich habe nicht, wie Argumente zu übergeben, und rufen Sie diese Funktion von Java.

EDIT

Ich kann fn(Runnable) oder fn(Callable) machen, aber ich weiß noch nicht, wie Argumente zu einem dieser beiden passieren, von meiner Java-Implementierung von fn?

Antwort

4

Bitte vermeiden Sie interne Nashorn-Typen wie jdk.nashorn.internal.runtime.ScriptFunction in Ihrem Java-Code. Mit jdk9 verhindern modulare modulare Zutrittsprüfungen den Zugriff auf solche Typen über den Benutzercode!

Wenn Sie ein Rückruf an Ihrem Java-Code übergeben werden wollen, die in Nashorn-Skript implementiert ist, gibt es zwei Ansätze:

1) Nehmen Sie jeden @FunctionalInterface Typen im Code (https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html) wie Supplier, Consumer, Function usw. Nashorn erlaubt, dass jede Skriptfunktion als Argument übergeben wird, wenn ein funktionales Schnittstellenobjekt in Java-Code benötigt wird. Vom Skript aus können Sie eine Skriptfunktion übergeben. Auf Java-Seite, rufen Sie einfach nur als Interface-Methode (wie "get", "annehmen", "gilt" usw. - das sind funktionelle Methoden auf Supplier, Consumer, Function jeweils)

2) Akzeptieren jdk.nashorn.api.scripting.JSObject (https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html) Geben Sie das Argument in Ihren Java-Code ein. Vom Skript aus können Sie eine Skriptfunktion als Argument übergeben, wenn JSObject in einem Java-Aufruf benötigt wird. Aus Java-Code können Sie "Call" -Methode auf JSObject [https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html#call-java.lang.Object-java.lang.Object...-]

+0

Und was passiert, wenn Ihr Java-Code eine Überladung wie öffentliche Versprechen hat dann (Verbraucher onFulfilled, Verbraucher onRejected) und auch öffentliche Versprechen dann (Funktion onFulfilled, Function onRejected) '...' java.lang.NoSuchMethodException: Kann nicht eindeutig zwischen fixen Arity-Signaturen auswählen 'hinzugefügt eine zusätzliche Überladung für dann (JSObject ... selbe Fehler. Wie auch immer, um die Überladungen zu halten und standardmäßig nashorn zu haben ein Fallback? Wenn eine ScriptFunction-Überladung auftritt, wird der Fehler entweder nicht behoben – xer21