javascript - 如何从 Java 调用 Nashorns `ScriptFunction` 回调?

标签 javascript java java-8 nashorn

我有一些 JavaScript 代码在 Java Nashorn 中的我的对象上执行:

scriptEngine.eval("my.fn(function(a,b) {...}");

我可以在接收 ScriptFunction 的类中创建方法 fn,但我不知道如何传递参数并从 Java 调用此函数。

编辑

我可以制作 fn(Runnable)fn(Callable) 但我仍然不知道如何从我的 Java 实现将参数传递给这两个中的任何一个fn

最佳答案

请避免使用任何 nashorn 内部类型,例如 jdk.nashorn.internal.runtime.ScriptFunction在你的Java代码中。使用 jdk9,jigsaw 模块化访问检查可防止从用户代码访问此类类型!

如果您确实希望将回调传递给在 Nashorn 脚本中实现的 Java 代码,有两种方法:

1) 接受任何@FunctionalInterface输入您的代码( https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html ),例如 Supplier , Consumer , Function当 java 代码中需要函数式接口(interface)对象时,Nashorn 允许将任何脚本函数作为参数传递。从脚本中,您可以传递脚本函数。在java方面,您只需作为接口(interface)方法进行调用(例如“get”,“accept”,“apply”等 - 这些分别是 SupplierConsumerFunction 上的函数方法)

2) 接受jdk.nashorn.api.scripting.JSObject ( https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html ) 在 Java 代码中输入参数。从脚本中,当 Java 调用中需要 JSObject 时,您可以将脚本函数作为参数传递。从 Java 代码中,您可以调用 JSObject 上的“call”方法 [ https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html#call-java.lang.Object-java.lang.Object...- ]

关于javascript - 如何从 Java 调用 Nashorns `ScriptFunction` 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38846764/

相关文章:

javascript - 为什么我的快照返回 null,即使 Firebase 数据库上有值

javascript - Chrome扩展storage.local.set "Cannot read property '名称'未定义”

java - 相同的:没有输出

java - 在命令行上更新线程进度

java - 为什么 Comparable 在 jdk 1.8 中没有声明为 @FunctionalInterface 尽管它是 FunctionalInterface 之一?

java - 为什么 Java 8 中没有默认构造函数?

javascript - 如何使用JS显示数据库中的图片

javascript - 将 javascript 文本编辑器 gui 导入我的网络应用程序

java - 寻找素数的程序。第二章 自测schildt java初学者指南

java - Java 8 中字段名称的硬链接(hard link)