2016-08-09 4 views
2

私は、Java Nashornに私のオブジェクトに実行されるいくつかのJavaScriptコードがあります:私はScriptFunctionを受け取る私のクラスにメソッドfnを作成することができますが、私は、引数を渡す方法を取得し、これを起動していないJavaからNashornsの `ScriptFunction`コールバックを呼び出すには?

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

をJavaからの関数です。

EDIT

私はfn(Runnable)またはfn(Callable)を行うことができますが、私はまだfnの私のJava実装から、これら2のいずれかに引数を渡す方法がわかりませんか?

答えて

4

Javaコードでjdk.nashorn.internal.runtime.ScriptFunctionのようなナショーン内部型を使用しないでください。 jdk9を使用すると、ジグソーモジュラーアクセスチェックは、そのようなタイプをユーザーコードからアクセスすることを防ぎます!

あなたはコールバックがNashornスクリプトで実装されたJavaコードに渡されたくない場合は、二つのアプローチがあります。

1)は、SupplierConsumerのようなあなたのコード内の任意の@FunctionalInterfaceタイプ(https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html)を受け入れますFunctionなどです。Nashornは、Javaコードで機能インタフェースオブジェクトが必要な場合に、任意のスクリプト関数を引数として渡すことができます。スクリプトから、スクリプト関数を渡すことができます。 Java側では、あなただけのインターフェイスメソッドとしてだけで呼び出す(のような、など「適用」「受け入れる」、「取得」 - これらは、それぞれSupplierConsumerFunctionに機能的な方法です)

2)受け入れjdk.nashorn.api.scripting.JSObjecthttps://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html )型引数をJavaコードに追加します。スクリプトからJSObjectがJava呼び出しで必要なときにスクリプト関数を引数として渡すことができます。 Javaコードから、JSObjectの "call"メソッドを呼び出すことができます。https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html#call-java.lang.Object-java.lang.Object...-

+0

そして、あなたのJavaコードが '' Public Promise(Consumer onFulfilled、Consumer onRejected) 'や' 'Public Promise then(Function onFulfilled、Function onRejected) '...' java.lang.NoSuchMethodException:固定アリティシグネチャの間で明白に選択できませんでした(JSObject ...同じエラーです)。オーバーロードを保持し、デフォルトのフォールバック?ScriptFunctionのオーバーロードを使用しても、FYI – xer21

関連する問題