5

我当前的 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)

我怎样才能调用这个函数?

4

1 回答 1

5

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

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

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

于 2014-06-18T09:21:31.313 回答