Почему тип цели для invokevirtual изменился с цели javac 1.1 на 1.2? - PullRequest
0 голосов
/ 05 июня 2018

Я знаю, что это древние версии 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 голосов
/ 16 июля 2018

После некоторых исследований похоже, что это изменение было введено в javac начиная с Java 1.2, чтобы соответствовать правилам двоичной совместимости JLS.Следующая цитата взята непосредственно из исходного кода javac :

Начиная с -target 1.2, мы подчиняемся правилам JLS для двоичной совместимости, испуская в качестве квалифицирующего типа ссылки наметод или поле тип классификатора.В более ранних целях мы использовали в качестве квалифицирующего типа класс, в котором был найден член.

...