Jvm 为什么javac会两次对数组进行校验?
在检查字节码时,我注意到javac在转换到数组类型时似乎复制了Jvm 为什么javac会两次对数组进行校验?,jvm,bytecode,javac,jikes,Jvm,Bytecode,Javac,Jikes,在检查字节码时,我注意到javac在转换到数组类型时似乎复制了checkcast指令 Cast.java: class Cast { void test(Object a) { Object[] b = (Object[])b; } } javac编译版本的javap反汇编 void test(java.lang.Object); Code: 0: aload_1 1: checkcast #2; //class "[Ljava/lang/Objec
checkcast
指令
Cast.java:
class Cast {
void test(Object a) {
Object[] b = (Object[])b;
}
}
javac编译版本的javap反汇编
void test(java.lang.Object);
Code:
0: aload_1
1: checkcast #2; //class "[Ljava/lang/Object;"
4: checkcast #2; //class "[Ljava/lang/Object;"
7: astore_2
8: return
测试jikes显示了预期的单次强制转换
void test(java.lang.Object);
Code:
0: aload_1
1: checkcast #10; //class "[Ljava/lang/Object;"
4: astore_2
5: return
checkcast
如果对象不能被视为请求的类型,或者什么都不做,那么应该引发异常,所以我不明白为什么它可能有助于使强制转换加倍。我还没有查看JDK源代码来了解它是如何产生的,如果这有助于解释原因(也许这只是一个提示)。这是javac的一个例子。但它基本上是无害的。有趣的是。。。其他地方讨论:谢谢参考。我的搜索失败了。你会认为它会被修复,修复起来有多难!