是否有一种与语言无关的方法来向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 ,它sun.org.mozilla.javascript.internal.InterpretedFunction我的需求。 但它显然不适用于Jython或其他什么,我想使这种语言无关。

我不希望我的脚本用户必须键入quitObject.run()因为它很笨拙,我不想解析脚本输入来查找quit()因为它可能埋没在其他代码中。

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

这些function是“脚本化”的,这或多或少都是你做的。

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

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