java - 为什么 invokevirtual 的目标类型从 javac target 1.1 更改为 1.2?

标签 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?

最佳答案

经过一些研究,似乎从 Java 1.2 开始在 javac 中引入了此更改,以便遵守 JLS 二进制兼容性规则。以下引用直接来自the javac source code :

Beginning with -target 1.2 we obey the JLS rules for binary compatibility, emitting as the qualifying type of a reference to a method or field the type of the qualifier. In earlier targets we use as the qualifying type the class in which the member was found.

关于java - 为什么 invokevirtual 的目标类型从 javac target 1.1 更改为 1.2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50705786/

相关文章:

java - ExecutorService.invokeAll(timeout, TimeUnit) 与 Future.get(timeout, TimeUnit)

java - 如何在 Java 编译后保留接口(interface)的参数名称?

java - Ant测试编译找不到主类

java - 尝试使用 objectdraw 运行 java 程序时出现线程 "main"错误异常

java - 如何从 java 代码创建*独立* linux 可执行文件

java集合: Filter using mapped values and then return to initial values

java - @ModelAttribute在Spring框架中如何工作?

java - 使用参数创建模板类型的新对象

java - 为什么编译包含静态嵌套类的类会创建一个名为 "EnclosingClass$1"的新 .class 文件?

java - 通过build.gradle文件告诉IntelliJ为Javac设置-parameters标志