Javascript 如何从Java调用Nashorn`ScriptFunction`回调?

Javascript 如何从Java调用Nashorn`ScriptFunction`回调?,javascript,java,java-8,nashorn,Javascript,Java,Java 8,Nashorn,我在Java Nashorn中的对象上执行了一些javascript代码: scriptEngine.eval("my.fn(function(a,b) {...}"); 我可以在类中创建方法fn,该方法接收ScriptFunction,但我不知道如何从Java传递参数和调用该函数 编辑 我可以将fn(Runnable)或fn(Callable)设置为fn(Runnable),但从我的fn的Java实现来看,我仍然不知道如何将参数传递给这两个变量中的任何一个。请避免在Java代码中使用任何na

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

scriptEngine.eval("my.fn(function(a,b) {...}");
我可以在类中创建方法
fn
,该方法接收
ScriptFunction
,但我不知道如何从Java传递参数和调用该函数

编辑


我可以将
fn(Runnable)
fn(Callable)
设置为
fn(Runnable)
,但从我的
fn
的Java实现来看,我仍然不知道如何将参数传递给这两个变量中的任何一个。

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

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

1) 接受任何
@functional interface
输入代码(),如
供应商
消费者
函数
等。当java代码中需要函数接口对象时,Nashorn允许将任何脚本函数作为参数传递。从脚本中,可以传递脚本函数。在java方面,您只需调用接口方法(如“get”、“accept”、“apply”等)。这些方法分别是
供应商
消费者
函数
上的函数方法


2) 在Java代码中接受jdk.nashorn.api.scripting.JSObject()类型参数。当Java调用中需要JSObject时,可以通过脚本将脚本函数作为参数传递。从Java代码中,您可以调用JSObject[]

上的“call”方法,以及当您的Java代码有一个重载时会发生什么,比如
公共承诺(Consumer oncompleted,Consumer onRejected)
公共承诺(Function oncompleted,Function onRejected)
java.lang.NoSuchMethodException:无法在固定算术签名之间进行明确选择
为此添加了额外的重载(JSObject…相同的错误。无论如何,要保留重载并使nashorn默认为回退,使用ScriptFunction重载也无法解决此错误仅供参考