是否有一种与语言无关的方法来为JSR223脚本绑定添加函数?

时间:2012-11-26 18:48:34

标签: java function scripting jsr223

JSR223 Bindings class允许您将任意Java对象公开给脚本语言。但他们必须是对象。我想定义一个函数quit(),它可以从脚本环境中调用,在Java中变成quitObject.run()。但是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(),因为它可能被隐藏在其他代码中。

1 个答案:

答案 0 :(得分:1)

如果你看javascript engine source code,你就会发现oracle / sun如何实现2个功能(print和println),这些功能在你启动引擎时神奇地(或不那么神奇地)存在。

这些功能是'脚本',这或多或少都是你做的。

我要做的是:在评估新上下文中的任何其他输入之前,加载并评估bootstrap.[language_extension]

您可以轻松地为要支持的每种语言创建此类脚本。