java - 调用匿名 JavaScript 函数

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

如何调用这个函数?

最佳答案

不要在 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/

相关文章:

javascript - 如何从另一个 div 内容绑定(bind) fancybox 内容?

javascript - setTimeOut() 或 setInterval() 。 4 种方法来应用相同的东西。哪个最好?

java - Spark Sql 不支持日期格式

java - 如何使 JOptionPane.showConfirmDialog 默认没有选中?

java - WSO2 Identity Server - JDBC 上的自定义用户存储管理器 - 更改密码错误

javascript - javascript 中的动态复选框列表 - 不起作用

javascript - Angular ng 内容 : how to use parents data as children input

java - java.lang.NoSuchMethodError:org.apache.hadoop.hive.metastore.HiveMetaStoreClient.alter_table

javascript - 将一行 javascript 添加到我所有域的 <head> 标记中。不确定它是什么或来自哪里

php - 旧 PHP 版本中 "use"的替代