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

Java 是否有一种独立于语言的方式向JSR223脚本绑定添加函数?,java,function,scripting,jsr223,Java,Function,Scripting,Jsr223,允许您向脚本语言公开任意Java对象。但它们必须是对象。我想定义一个函数quit(),它可以从脚本环境中调用,在Java中变成quitObject.run()。但是JSR223没有定义函数对象的概念。在Javascript中是否有一种独立于语言的方法来执行以下操作,即获取Runnable()并在脚本环境中创建函数 static private Object asFunction(ScriptEngine engine, Runnable r) throws ScriptExcepti

允许您向脚本语言公开任意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.expressedfunction
,它满足了我的需求。但它显然在Jython或其他任何地方都不起作用,我想让这种语言独立

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

如果你看一下,你会发现oracle/sun是如何实现了两个神奇(或不那么神奇)的函数(print和println)当你发动引擎时,请出示

这些函数都是“脚本化”的,这或多或少就是您所做的

我要做的是:在评估新上下文中的任何其他输入之前,加载并评估一个
引导。[language\u extension]

您可以很容易地为您想要支持的每种语言创建这样的脚本。

很有趣——这不是我想的,但我必须检查一下!谢谢