我知道这些都是古老的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?
发布于 2018-07-16 08:36:13
经过一些研究之后,为了遵守JLS二进制兼容性规则,在Java1.2的javac中引入了这个更改。下面的引号直接来自javac源代码
从-target 1.2开始,我们遵守关于二进制兼容性的JLS规则,作为对方法或字段的限定符类型的引用的限定类型发出。在早期的目标中,我们使用成员所在的类作为限定类型。
https://stackoverflow.com/questions/50705786
复制相似问题