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

时间:2016-08-09 09:20:24

标签: javascript java java-8 nashorn

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

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

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

修改

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

1 个答案:

答案 0 :(得分:4)

请避免在Java代码中使用任何nashorn内部类型,例如jdk.nashorn.internal.runtime.ScriptFunction。使用jdk9,拼图模块化访问检查会阻止从用户代码访问这些类型!

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

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

2)在Java代码中接受jdk.nashorn.api.scripting.JSObjecthttps://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html)类型参数。从脚本中,您可以在Java调用中需要JSObject时将脚本函数作为参数传递。从Java代码中,您可以在JSObject [https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html#call-java.lang.Object-java.lang.Object...-]

上调用“call”方法