我当前的 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)
如何调用这个函数?
最佳答案
不要在 Nashorn 和 Java 之间传递函数。传递实现 functional interfaces 的对象.
我假设 o.timer
是用 Java 实现的。在这种情况下,将其参数设置为 Runnable (一个函数的通用函数接口(interface),它什么都不接受也不返回什么)。 Nashorn 将检测到 Java 需要一个功能接口(interface),并将能够自动将该函数转换为实现该接口(interface)的匿名类,因此您无需更改 Javascript 代码中的任何内容即可实现这一点。
然后在您的 Java 代码中,您可以使用 .run()
执行该 Runnable 的脚本函数。然后,javascript 代码将在创建它的脚本上下文中执行。
关于java - 调用匿名 JavaScript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24267744/