不同的 Java 字节码反编译为完全相同的 p 代码和 java 代码

Different Java bytecode decompile to exactly the same p-code and java code

我生成了两个 java 字节码文件 1.class and 2.class,如果使用十六进制文件查看器检查它们,它们是不同的:

但是反编译后的p代码都是一样的:

我也可以使用jd-gui将它们反编译成Java源代码,这两个字节码文件再次生成完全相同的Java源代码:

所以看起来一切都很好,但是当我将字节码的两个副本加载到 class 加载器时,1.class 副本给我以下错误:

有人知道吗?

如果使用javap -l打印出行号信息,可以发现2.class对于doIt(String, String, AppContext)有如下行号table:

LineNumberTable:
  line 56: 0
  line 57: 11
  line 58: 19
  line 60: 23
  line 61: 65

据此,第61行链接到字节码索引65,而同一方法仅由总共64个字节定义。因此,这个 table 不正确并抛出验证器错误。