在JSR223 Bindings
类可以让你暴露任意的Java对象的脚本语言。 但他们必须是对象。 我想定义一个函数quit()
可以从脚本环境,变成了被称为quitObject.run()
在Java中。 但是JSR223没有定义一个函数对象的概念。 是否有一个独立于语言的方式做在Javascript以下,即把一个Runnable()和创建的脚本环境的功能?
static private Object asFunction(ScriptEngine engine, Runnable r)
throws ScriptException
{
final Bindings bindings = engine.createBindings();
bindings.put("r", r);
return engine.eval(
"(function (r) { var f = function() { r.run(); }; return f;})(r)",
bindings);
}
Runnable quitObject = /* get/create a Runnable here */
Bindings bindings = engine.createBindings();
bindings.put("quit", asFunction(engine, quitObject));
随着JSR223的内置JavaScript支持,这将创建一个sun.org.mozilla.javascript.internal.InterpretedFunction
这我想要做什么。 但它显然不会在Jython或任何工作,我想使这一语言无关。
我不希望我的脚本的用户必须键入quitObject.run()
因为这是笨拙的,我不想来解析脚本输入查找quit()
因为它可以在其他代码中被埋没。