Java Scripting(jsr223):是否可以(重新)添加rhino编译功能

时间:2013-05-15 11:11:12

标签: java javascript rhino jsr223

Oracle在jdk6

中包含了剥离的rhino

其中一个被剥离的功能是rhino js到字节码编译器

是否可以将其包含在应用程序级别?

我想在不改变jsr223调用的情况下提高性能

1 个答案:

答案 0 :(得分:0)

我得到了它的工作

基本上你需要做的就是包含rhino的org.mozilla.javascript.optimizer包。

然而,这并不像将它放入项目那么容易,因为oracle改变了rhino实现的命名空间。

所以你必须移植包,其中包含大量指向错误命名空间的字符串(用于类生成)

我还需要将Optimizer注入内部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类 - 它取决于上下文类的oracle端口,但我没有找到任何源..

但这个apporoach有一个很大的缺点:

codegen端口针对特定的rhino版本,可能无法在所有vm版本上运行,也可能在vm更新时中断

所以我删除了jsr233 api并直接使用rhino作为库。 我也经历了很大的性能提升 - 我希望jsr233 api为一些js调用增加了很多开销。