是否有一种独立于语言的方法向 JSR223 脚本绑定添加函数



JSR223 Bindings类允许您向脚本语言公开任意 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()因为它可能隐藏在其他代码中。

如果你看一下javascript引擎的源代码,你会发现oracle/sun是如何实现2个函数(print和println)的,当你启动引擎时,这些函数是神奇的(或不那么神奇的)。

这些函数是 "脚本化" ,这或多或少是你所做的。

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

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

相关内容

最新更新