如何从Java中调用nashorn的ScriptFunction回调

How to invoke Nashorns `ScriptFunction` callback from Java?

本文关键字:nashorn ScriptFunction 回调 调用 Java      更新时间:2023-09-26

我有一些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...-]

上调用"call"方法