jvm - 为什么 javac 校验数组两次?

标签 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/Object;"
   4:   checkcast   #2; //class "[Ljava/lang/Object;"
   7:   astore_2
   8:   return

测试 jikes 显示了预期的单一 Actor 阵容
void test(java.lang.Object);
  Code:
   0:   aload_1
   1:   checkcast   #10; //class "[Ljava/lang/Object;"
   4:   astore_2
   5:   return
checkcast如果对象不能被视为请求的类型,则应该引发异常,否则什么都不做,所以我不明白为什么它可能有助于将转换加倍。我还没有查看 JDK 源代码以了解它是如何生成的,如果这有助于解释原因(也许这只是一个提示)。

最佳答案

这是一个 known bug的javac。但它大多是无害的。

关于jvm - 为什么 javac 校验数组两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2404240/

相关文章:

java - 从字节码获取调用层次结构(在 Eclipse 中)

java - 为什么 Map#put 指定@throws ClassCastException?

Javac 找不到类路径中引用的包

java - 32 位和 64 位 Windows 服务器上 JVM 的最大堆大小

java - 如何检测 Mac OsX 10.7 上是否下载了 JavaVM

multithreading - 理解JVM的 "Attach Listener"线程

Java ASM 字节码 - 查找属于特定方法调用的所有指令

java - 在没有源代码的已编译 1.6 Java 类中更改整数字段的最佳方法

android - 如何解决 Android 工具中的 javac 增量构建未检测到应导致重新编译的更改?

java - 添加代码到eclipse jvm配置