调用匿名JavaScript函数

调用匿名JavaScript函数,java,javascript,anonymous-function,nashorn,Java,Javascript,Anonymous Function,Nashorn,我当前的JavaScript如下所示: o.timer(function (){ //Call from Java print("Hello World"); }).start(1000); 在Java端,接收我试图调用的jdk.nashorn.internal.runtime.ScriptFunction ScriptFunction callback = ... callback.getBoundInvokeHandle(MethodType.methodType(Obje

我当前的JavaScript如下所示:

o.timer(function (){
    //Call from Java
    print("Hello World");
}).start(1000);
在Java端,接收我试图调用的jdk.nashorn.internal.runtime.ScriptFunction

ScriptFunction callback = ...
callback.getBoundInvokeHandle(MethodType.methodType(Object.class)).invoke();
但它抛出了这样一个问题:

java.lang.IllegalStateException: no current global instance
at jdk.nashorn.internal.objects.Global.instance(Global.java:474)
at jdk.nashorn.internal.objects.ScriptFunctionImpl.<init>(ScriptFunctionImpl.java:145)
at jdk.nashorn.internal.scripts.Script$\^eval\_._L3(<eval>:6)
at demo.Mainr$1.run(Main.java:38)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
java.lang.IllegalStateException:没有当前全局实例
位于jdk.nashorn.internal.objects.Global.instance(Global.java:474)
位于jdk.nashorn.internal.objects.ScriptFunctionImpl.(ScriptFunctionImpl.java:145)
在jdk.nashorn.internal.scripts.Script$^eval\.\uL3(:6)
在demo.Mainr$1.run(Main.java:38)
位于java.util.TimerThread.mainLoop(Timer.java:555)
在java.util.TimerThread.run(Timer.java:505)

如何调用此函数?

不要在Nashorn和Java之间传递函数。传递实现的对象

我假设
o.timer
是用Java实现的。在这种情况下,将其参数设为a(函数的通用函数接口,该函数不接受任何内容,也不返回任何内容)。Nashorn将检测到Java需要一个函数接口,并能够自动将该函数转换为实现该接口的匿名类,因此您不必在Javascript代码中进行任何更改


在Java代码中,您可以使用
.run()
执行该Runnable的脚本函数。然后,javascript代码将在创建它的脚本上下文中执行。

如何将参数传递给此
Runnable
调用?@当您想要传递某些内容给它时,创建一个新的函数接口,该接口包含参数。