java - 从 Nashorn 脚本中对 Java 对象设置 "Callable"

标签 java nashorn scriptengine

我有一个类实例,上面有一个 Callable 字段。我在 Bindings 对象上设置此实例。我需要在 Nashorn 中设置 Callable 字段,以便在 Java 中调用。我如何在 Nashorn 脚本中设置此字段?

脚本的调用方式如下:

//in java
class Options {
    Callable<Boolean> handler;
}
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
Bindings bindings = engine.createBindings();
Options options = new Options();
bindings.put("options", options);
engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
engine.eval(script);
Invocable executor = (Invocable) engine;
executor.invokeFunction("init");

在脚本中,我需要在全局 Options 对象上设置 handler 字段:

//in nashorn
function init() {
    //How would I set a Callable on this field, from within nashorn?
    options.handler = ?
}

我已经看到(建议重复的)问题 How to use Nashorn engine to call Java Objects ,但是这个问题是关于从 Nashorn 脚本调用 Java 方法,而这个问题是关于在 Nashorn 脚本中设置可调用对象,然后可以从 Java 调用该方法(基本上相反)。

最佳答案

基于此 nashorn tutorial 中的“扩展类”部分。测试过,为我工作:

   var Callable = Java.type('java.util.concurrent.Callable');
   var CallableImpl = Java.extend(Callable, {
     call: function() {
       print('test');
     }
   });
   
   options.handler = new CallableImpl();

关于java - 从 Nashorn 脚本中对 Java 对象设置 "Callable",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65297584/

相关文章:

java - Nashorn:如何在 JavaScript 执行之前在 Java 内部预先设置 Java.type()-vars?

javascript - 在 android 中引用 javax.script.ScriptEngine 或计算 javascript 表达式

java - JAVA中的一些奇怪行为

java - Spring 可以在 OPTIONS 方法上自动生成 'Allow' header 吗?

java - Nashorn JavaScript Invocable.getInterface 在 Web 应用程序中跨类加载器失败

javascript - 如何调用 Nashorn CompiledScript 中的方法?

java - 运行 Spring Boot 应用程序时出现 ClassNotFoundException

java - 根据日期条件从mysql数据库表中获取数据

java - 为什么我无法访问匿名内部类中重写的公共(public)字段?

java - 验证 JavaScript 代码