JSR223类允许您向脚本语言公开任意 Java 对象。Bindings
但它们必须是对象。我想定义一个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()
,因为它可能隐藏在其他代码中。