【发布时间】:2015-01-28 16:15:56
【问题描述】:
我的应用程序使用 Rhino 来混合 javascript 代码和 Java 对象。
在 JVM 1.5、1.6 和 1.7 上一切正常,但在运行时使用 JVM 1.8.0 时会生成错误的 ArrayIndexOutOfBoundsException:
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
public class RhinoOn8 {
static public void main(String[] args) throws SecurityException, NoSuchMethodException {
Context ctx = Context.enter();
Scriptable scope = ctx.initStandardObjects();
Object ev = ctx.evaluateString(scope, "'' + java.lang.System.getProperty(\"user.name\")", "exec", 0, null);
System.out.println(ev);
Context.exit();
}
}
在 JVM Oracle 1.7.0_55 上运行良好,并在 JVM Oracle 1.8.0_31 上执行此操作:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5747
at org.mozilla.javascript.net.sf.retrotranslator.runtime.asm.ClassReader.readClass(ClassReader.java:1572)
at org.mozilla.javascript.net.sf.retrotranslator.runtime.asm.ClassReader.accept(ClassReader.java:341)
at org.mozilla.javascript.net.sf.retrotranslator.runtime.asm.ClassReader.accept(ClassReader.java:300)
at org.mozilla.javascript.net.sf.retrotranslator.runtime.impl.ClassDescriptor.<init>(ClassDescriptor.java:67)
at org.mozilla.javascript.net.sf.retrotranslator.runtime.impl.ClassDescriptor.getInstance(ClassDescriptor.java:82)
at org.mozilla.javascript.net.sf.retrotranslator.runtime.impl.MethodDescriptor.getInstance(MethodDescriptor.java:120)
at org.mozilla.javascript.net.sf.retrotranslator.runtime.java.lang.reflect._Method.isVarArgs(_Method.java:96)
at org.mozilla.javascript.jdk15.VMBridge_jdk15.isVarArgs(VMBridge_jdk15.java:33)
at org.mozilla.javascript.MemberBox.init(MemberBox.java:44)
at org.mozilla.javascript.MemberBox.<init>(MemberBox.java:32)
at org.mozilla.javascript.JavaMembers.reflect(JavaMembers.java:455)
at org.mozilla.javascript.JavaMembers.<init>(JavaMembers.java:43)
at org.mozilla.javascript.JavaMembers.lookupClass(JavaMembers.java:807)
at org.mozilla.javascript.NativeJavaObject.initMembers(NativeJavaObject.java:54)
at org.mozilla.javascript.NativeJavaObject.<init>(NativeJavaObject.java:44)
at org.mozilla.javascript.NativeJavaObject.<init>(NativeJavaObject.java:34)
at org.mozilla.javascript.WrapFactory.wrapAsJavaObject(WrapFactory.java:115)
at org.mozilla.javascript.WrapFactory.wrap(WrapFactory.java:72)
at org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:236)
at org.mozilla.javascript.optimizer.OptRuntime.call1(OptRuntime.java:32)
at org.mozilla.javascript.gen.exec_1._c_script_0(exec:0)
at org.mozilla.javascript.gen.exec_1.call(exec)
at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:394)
at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3091)
at org.mozilla.javascript.gen.exec_1.call(exec)
at org.mozilla.javascript.gen.exec_1.exec(exec)
at org.mozilla.javascript.Context.evaluateString(Context.java:1079)
at RhinoOn8.main(RhinoOn8.java:12)
我尝试使用 Rhino1.7R4 和 Rhino1.7R5pre 得到相同的结果。
有人知道解决方法(不更改 JS 源)?
【问题讨论】:
-
不应该在JDK8中使用Nashorn吗?有使用 Rhino 的理由吗?
-
这适用于应该在多个 java 版本上运行的 web 应用程序。
-
我刚刚在 Windows 7 上使用 Rhino1.7R4 和 64 位 JDK 1.8.0_31 进行了尝试,并且成功了。
-
我在使用 32 位 JVM 的 64 位 Linux 上。我会在其他操作系统上试试看。
-
Windows 8.1 64 和 1.8.0_31 32 位 JVM 上的相同错误。
标签: java java-8 rhino retrotranslator