我有一些 JavaScript 代码在 Java Nashorn 中的我的对象上执行:
scriptEngine.eval("my.fn(function(a,b) {...}");
我可以在接收 ScriptFunction
的类中创建方法 fn
,但我不知道如何传递参数并从 Java 调用此函数。
编辑
我可以制作 fn(Runnable)
或 fn(Callable)
但我仍然不知道如何从我的 Java 实现将参数传递给这两个中的任何一个fn
?
最佳答案
请避免使用任何 nashorn 内部类型,例如 jdk.nashorn.internal.runtime.ScriptFunction
在你的Java代码中。使用 jdk9,jigsaw 模块化访问检查可防止从用户代码访问此类类型!
如果您确实希望将回调传递给在 Nashorn 脚本中实现的 Java 代码,有两种方法:
1) 接受任何@FunctionalInterface
输入您的代码( https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html ),例如 Supplier
, Consumer
, Function
当 java 代码中需要函数式接口(interface)对象时,Nashorn 允许将任何脚本函数作为参数传递。从脚本中,您可以传递脚本函数。在java方面,您只需作为接口(interface)方法进行调用(例如“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 ) 在 Java 代码中输入参数。从脚本中,当 Java 调用中需要 JSObject 时,您可以将脚本函数作为参数传递。从 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...- ]
关于javascript - 如何从 Java 调用 Nashorns `ScriptFunction` 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38846764/