是否有一种与语言无关的方法来向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]
。
您可以轻松地为要支持的每种语言创建此类脚本。
- setDefaultCloseOperation代替显示JFrame
- Scala对Java进行并发编程有什么优势?
- 在Java J2ME中使用new运算符和没有new运算符分配的字符串有什么区别?
- “线程中的exception”main“java.util.InputMismatchException”**
- 在一个弹簧启动容器中运行多个Web应用程序
- 创建动态Web服务,动态Web服务调用程序
- 原因 – List list = new ArrayList();
- java.lang.ClassNotFoundException:org.springframework.boot.SpringApplication Maven
- 用jackson反序列化枚举