如何从Java中调用nashorn的ScriptFunction回调
How to invoke Nashorns `ScriptFunction` callback from Java?
我有一些javascript代码在Java Nashorn对象上执行:
scriptEngine.eval("my.fn(function(a,b) {...}");
我可以在我的类中创建方法fn
,接收ScriptFunction
,但我不知道如何传递参数并从Java调用此函数。
我可以使fn(Runnable)
或fn(Callable)
,但我仍然不知道如何传递参数到这两个,从我的Java实现的fn
?
请避免在Java代码中使用任何像jdk.nashorn.internal.runtime.ScriptFunction
这样的内部类型。使用jdk9, jigsaw模块化访问检查可以防止从用户代码访问此类类型!
如果你想要一个回调传递给你的Java代码(在Nashorn脚本中实现),有两种方法:
1)在代码中接受任何@FunctionalInterface
类型(https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html),如Supplier
, Consumer
, Function
等。当java代码中需要函数接口对象时,Nashorn允许将任何脚本函数作为参数传递。从脚本,您可以传递一个脚本函数。在java端,您只需调用接口方法(如"get","accept","apply"等-这些分别是Supplier
, Consumer
, Function
上的函数方法)
2)在Java代码中接受jdk.nashorn.api.scripting.JSObject
(https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html)类型参数。当Java调用中需要JSObject时,可以通过脚本将脚本函数作为参数传递。从Java代码中,您可以在JSObject [https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html#call-java.lang.Object-java.lang.Object...-]
- 扩展Nashorn-ecma引擎以添加新的运算符和类型
- 将toString方法暴露给nashorn中的js对象
- Nashorn和Rhino:使用空白regexp拆分字符串
- Nashorn Parser API on JDK 8
- Java,nashorn访问另一个js文件
- 如何使用Nashorn?它如何提高性能
- Nashorn Script Engine 在 Java 8 SE Embedded 上为空
- 我可以使用 Nashorn 在新引擎作用域中调用函数吗?
- 如何在javascript Nashorn引擎中解析XML
- Java Nashorn中的(De)引用方法变体
- Java - ScriptEngineManager nashorn Math.random 不起作用
- read完全没有用Java Nashorn Javascript引擎定义
- 是 Nashorn 中的一个评估函数,可从不同的线程重用
- 将 React 与 Nashorn 一起使用会抛出“ReferenceError: 'console' is not d
- Nashorn:在 Typescript 中导入 Java 对象
- 在html的javascript文件中使用Nashorn
- Nashorn:如何选择要调用的构造函数
- 多线程 Nashorn: o.constructor === o.constructor 给出 false
- 在Java 8 Nashorn JavaScript引擎中同时加载脚本是否有意义
- 在 nashorn 中将 byte[] 转换为 ArrayBuffer