调用匿名JavaScript函数

时间:2014-06-17 15:27:00

标签: 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(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)

如何调用此功能?

1 个答案:

答案 0 :(得分:5)

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

我认为o.timer是用Java实现的。在这种情况下,将其参数设为Runnable(函数的通用函数接口,不带任何东西,不返回任何内容)。 Nashorn将检测到Java需要一个功能接口,并且能够自动将该功能转换为实现该接口的匿名类,因此您不必更改Javascript代码中的任何内容以使其执行此操作。

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