使用 Java 1.7 运行 Rhino 代码并使用 Java 1.8 进行异常处理
Working Rhino code with Java 1.7 and make Exeception with Java 1.8
我的应用程序使用 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 源)?
使用js.jar,不js-14.jar JVM 1.4 需要。
我的应用程序使用 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 源)?
使用js.jar,不js-14.jar JVM 1.4 需要。