【发布时间】:2013-05-15 11:11:11
【问题描述】:
Oracle 在 jdk6 中包含一个剥离的 rhino
其中一个剥离的功能是 rhino js 到字节码的编译器
是否可以在应用程序级别包含它?
我想在不改变 jsr223 调用的情况下提高性能
【问题讨论】:
标签: java javascript rhino jsr223
Oracle 在 jdk6 中包含一个剥离的 rhino
其中一个剥离的功能是 rhino js 到字节码的编译器
是否可以在应用程序级别包含它?
我想在不改变 jsr223 调用的情况下提高性能
【问题讨论】:
标签: java javascript rhino jsr223
我搞定了
基本上你需要做的就是包含 rhino 的 org.mozilla.javascript.optimizer 包。
然而,这并不像将它放到您的项目中那样简单,因为 oracle 更改了 rhino 实现的命名空间。
所以你必须移植包,其中包含大量指向错误命名空间的字符串(用于类生成)
我还需要将优化器注入到内部 rhino 上下文中:
Class c = Class.forName("sun.org.mozilla.javascript.internal.Context");
Field field = c.getDeclaredField("codegenClass");
field.setAccessible(true);
field.set(c, org.mozilla.javascript.optimizer.Codegen.class);
也可能有一种“自动注入”方式 - Rhinos Context 类自动期望 Codegen 类在特定包中 - 它取决于 context 类的 oracle 端口,但我没有找到任何来源..
但是这种方法有一个很大的缺点:
codegen 端口针对特定的 rhino 版本,可能不适用于所有 vm 版本,或者可能在 vm 更新时中断
所以我放弃了 jsr233 api 并直接使用 rhino 作为库。 我还体验到了性能的大幅提升——我预计 jsr233 api 会给一些 js 调用增加很多开销。
【讨论】: