在 Nashorn 脚本中对 Java 对象设置 "Callable"
Setting "Callable" on a Java object from within Nashorn script
我有一个 class 实例,上面有一个 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 中的 'Extending classes' 部分。经过测试,对我有用:
var Callable = Java.type('java.util.concurrent.Callable');
var CallableImpl = Java.extend(Callable, {
call: function() {
print('test');
}
});
options.handler = new CallableImpl();
我有一个 class 实例,上面有一个 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 中的 'Extending classes' 部分。经过测试,对我有用:
var Callable = Java.type('java.util.concurrent.Callable');
var CallableImpl = Java.extend(Callable, {
call: function() {
print('test');
}
});
options.handler = new CallableImpl();