我可能需要一些解释我找不到答案的东西 - 无论是在这里还是在javadoc或规范中......(至少到现在为止)
我正在构建一个必须在JSR 223的帮助下执行Javascript代码的应用程序。我通过一些JS对象与JS世界进行交互,这些对象可以通过全局变量使用。这就是我主要使用 Invocable.invokeMetho d来调用JS的原因。 (我通过 Invocable.invokeFunction 调用JS构造函数创建这些对象,并使用 ScriptEngine.put()在JS var中设置返回的对象。我读到的实际代码使用 ScriptEngine.eval())
现在这是一个服务器应用程序,因此CPU占用空间和执行速度非常重要。所以我发现了 Compilable 。这让我想到了第一个问题:为什么这个界面完全存在?为什么不同的脚本引擎内部透明地执行此操作?
好的,但回到我必须使用 Compilable 的假设。而不是使用 ScriptEngine.eval 读取我的JS源代码,而是使用 Compilable.compile()。哪个会将 CompiledScript 返回给我。其中的界面仅提供 eval 方法。但不是任何类似于 Invocable 的API的东西。
那么如何从 CompiledScript 返回 Invocable ?我仍然想使用它,API给了我一个很好的抽象! : - )
任何人都可以帮我解决这个问题? (这一切都发生在带有Rhino的Java 7上。当然,迁移到Java 8 - 意味着Nashorn - 即将推出,所以我将不得不处理这两个引擎。)
非常感谢, 托本
更新:好的,现在我发现我忽略了规范中的一些部分,即关于Invocable和Compilable的部分。因此,在使用Invocable时,我似乎已经获得了编译的好处(为什么他们没有在javadoc中提到这个?!)。
但是我还有一个问题:如何导入我的源代码?如果我用 ScriptEngine.eval 导入代码, Invocable 会对我的代码进行准编译吗?