我可能需要一些解释我还没有找到答案的东西 - 无论是在此处还是在 javadoc 或规范中......(至少到目前为止)
我正在构建一个必须在 JSR 223 的帮助下执行 Javascript 代码的应用程序。我通过几个 JS 对象与 JS 世界进行交互,这些对象可以通过全局变量获得。这就是为什么我主要使用Invocable.invokeMetho来调用 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会对我的代码进行准编译吗?