Ответ 1
Нет, компилятор создает их:
Я создал файл A.java
:
public class A{
public String t(){return "";}
}
то
javac A.java
и запустите javap -c A
, чтобы увидеть содержимое:
Compiled from "A.java"
public class A {
public A();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public java.lang.String t();
Code:
0: ldc #2 // String
2: areturn
}
если я добавлю конструктор:
public A(){}
результат:
Compiled from "A.java"
public class A {
public A();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public java.lang.String t();
Code:
0: ldc #2 // String
2: areturn
}
он идентичен. Я использую Java 7 с 64-битным OpenJDK, но я бы поспорил, что он одинаковый со всеми версиями.
EDIT: на самом деле один и тот же байт-код не гарантирует, что информация отсутствует как метаданные. Используя hex-редактор и эту программу удалось увидеть, что существуют два байта, отличающиеся и соответствующие номерам строк (используемым для печати стеков стека), поэтому в этом случае информация отсутствует.