Это хранится в «постоянном пуле» класса (наряду со всем остальным, классы и именами методов и т. Д.).
Вы бы использовали Javap, чтобы посмотреть на байт -код в читаемом формате.
Видеть Отличный блог Антона Аррипива на основе байт -кодов
Пример, взятый оттуда для класса:
public class Foo {
private String bar;
public String getBar(){
return bar;
}
...
... дает байт -код:
public java.lang.String getBar();
Code:
0: aload_0
1: getfield #2; //Field bar:Ljava/lang/String;
4: areturn
И имеет постоянный бассейн:
Compiled from "Foo.java"
public class Foo extends java.lang.Object
SourceFile: "Foo.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #4.#17; // java/lang/Object."<init>":()V
const #2 = Field #3.#18; // Foo.bar:Ljava/lang/String;
const #3 = class #19; // Foo
const #4 = class #20; // java/lang/Object
const #5 = Asciz bar;
const #6 = Asciz Ljava/lang/String;;
const #7 = Asciz <init>
const #8 = Asciz ()V;
const #9 = Asciz Code;
const #10 = Asciz LineNumberTable;
const #11 = Asciz getBar;
const #12 = Asciz ()Ljava/lang/String;;
const #13 = Asciz setBar;
const #14 = Asciz (Ljava/lang/String;)V;
const #15 = Asciz SourceFile;
const #16 = Asciz Foo.java;
const #17 = NameAndType #7:#8;// "<init>":()V
const #18 = NameAndType #5:#6;// bar:Ljava/lang/String;
const #19 = Asciz Foo;
const #20 = Asciz java/lang/Object;
Вы можете отследить ссылку на String
из Foo#getBar
через постоянный бассейн как:
- Getfield #2
- Где #2 - поле, ссылаясь на № 3. #18
- Где № 3 ссылается на класс № 19
- который является классом
Foo
- который является классом
- и № 18 - это NamEandtype ссылка № 5 и № 6
- и #5 - бар (поле)
- и № 6 - это ссылка на
java.lang.String
- Где № 3 ссылается на класс № 19
Я настоятельно советую прочитать блог Антона. Это действительно хорошо сделано!
Я также прочитал Статья Джеймса Д. Блума JVM Internals как охватывает много внутренней архитектуры JVM. Имейте в виду даты и версии, на которые ссылаются, по мере того, как все меняется (например, использование кучи Java в Java 8 и Inlining String.