为什么invokevirtual的目标类型从javac target 1.1变为1.2?

时间:2018-06-05 17:27:10

标签: java javac

我知道这些是古老的Java版本,但我仍然很好奇。给出以下代码段:

public void test(java.awt.event.MouseEvent e)
{
    System.out.println(e.getID());
}

使用javac -source 1.3 -target 1.1进行编译时,会生成以下内容:

public void test(java.awt.event.MouseEvent);
 Code:
   0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
   3: aload_1       
   4: invokevirtual #3                  // Method java/awt/AWTEvent.getID:()I
   7: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
  10: return 

使用javac -source 1.3 -target 1.2进行编译时,会生成以下内容:

public void test(java.awt.event.MouseEvent);
 Code:
   0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
   3: aload_1       
   4: invokevirtual #3                  // Method java/awt/event/MouseEvent.getID:()I
   7: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
  10: return

为什么invokevirtual的目标类型(见第4行)从目标1.1变为目标1.2?

1 个答案:

答案 0 :(得分:2)

经过一些研究,看来此更改是从Java 1.2开始在javac中引入的,目的是遵守JLS二进制兼容性规则。以下引文直接来自the javac source code

  

从-target 1.2开始,我们遵循二进制的JLS规则   兼容性,作为对   方法或字段的限定符类型。在较早的目标中,我们使用   作为找到成员的班级类型。