如何从 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
类型,例如 Supplier
、Consumer
、Function
等。Nashorn 允许任何脚本函数在 java 代码中需要功能接口对象时作为参数传递。从脚本中,您可以传递一个脚本函数。在 java 方面,您只需调用接口方法(如 "get"、"accept"、"apply" 等 - 这些是 Supplier
、Consumer
, 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...- ]
我在 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
类型,例如 Supplier
、Consumer
、Function
等。Nashorn 允许任何脚本函数在 java 代码中需要功能接口对象时作为参数传递。从脚本中,您可以传递一个脚本函数。在 java 方面,您只需调用接口方法(如 "get"、"accept"、"apply" 等 - 这些是 Supplier
、Consumer
, 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...- ]