如何从 Java 调用 Nashorns `ScriptFunction` 回调?

How to invoke Nashorns `ScriptFunction` callback from Java?

我在 Java Nashorn 中的对象上执行了一些 javascript 代码:

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

我可以在接收 ScriptFunction 的 class 中创建方法 fn,但我不知道如何从 Java 传递参数和调用此函数.

编辑

我可以创建 fn(Runnable)fn(Callable),但我仍然不知道如何将参数传递给这两个中的任何一个,从我的 Java 实现 fn

请避免在您的 Java 代码中使用任何 nashorn 内部类型,例如 jdk.nashorn.internal.runtime.ScriptFunction。使用 jdk9,jigsaw 模块化访问检查可防止从用户代码访问此类类型!

如果您确实希望将回调传递给在 Nashorn 脚本中实现的 Java 代码,有两种方法:

1) 在您的代码 (https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html) 中接受任何 @FunctionalInterface 类型,例如 SupplierConsumerFunction 等。Nashorn 允许任何脚本函数在 java 代码中需要功能接口对象时作为参数传递。从脚本中,您可以传递一个脚本函数。在 java 方面,您只需调用接口方法(如 "get"、"accept"、"apply" 等 - 这些是 SupplierConsumer, Function 分别)

2) 接受 jdk.nashorn.api.scripting.JSObject ( https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html) type argument in your Java code. From script, you can pass a script function as an argument when JSObject is needed in Java call. From Java code, you can invoke "call" method on JSObject [ https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html#call-java.lang.Object-java.lang.Object...- ]