是否可以在Java 6中设置RhinoScriptEngine的优化级别?

时间:2011-08-09 17:14:24

标签: java rhino

我遇到了Rhino通过javax.script.ScriptEngine API运行Rhino时抛出"Encountered code generation error while compiling script: generated bytecode for method exceeds 64K limit"异常的问题。接受的解决方案似乎是在setOptimizationLevel(-1)上调用sun.org.mozilla.javascript.Context

很遗憾,我似乎无法访问由Context创建的ContextFactory。我尝试将ContextFactory.Listener添加到ContextFactory.getGlobal(),以便在创建后修改Context,但我的监听器似乎永远不会被调用。我还查看了RhinoScriptEngine source from Java 6,看看是否有一个属性我可以设置ContextFactory将读取以确定优化级别的值。

据我所知,在Java 7中,RhinoScriptEngine默认情况下将优化级别设置为-1 可以通过{设置优化级别{1}}财产。将Java 7 version中的rhino.opt.level方法与Java 6 version中的makeContext()方法进行比较,看看我的意思。

据我所知,我认为我最好的选择是直接运行Rhino,如in this example of using Rhino to run the CoffeeScript compiler所示。虽然你可以看到,代码很麻烦,所以如果可能的话,我宁愿使用makeContext() API,同时继续支持Java 6.还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

,根据文档:http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html#jsengine

它说:

  

由于足迹和安全原因,一些组件被排除在外:

     
      
  1. JavaScript-to-bytecode编译(也称为“优化器”)。这个   功能取决于类生成库。删除这个   功能意味着 JavaScript将始终被解释。该   删除此功能不会影响脚本执行,因为   优化器是透明的。
  2.   

已排除优化器类以将其与JDK6捆绑在一起,因此无法为java 6设置优化级别。

答案 1 :(得分:1)

我正在使用6运行,默认情况下它似乎也设置为-1。或者更确切地说,除非sun.org.mozilla.javascript.internal.optimizer.Codegen在类路径上,否则它设置为-1。