يتم تخزين هذا في "التجمع الثابت" للفئة (إلى جانب كل شيء آخر ، والفئات وأسماء الأسلوب ، وما إلى ذلك).
يمكنك استخدام Javap للنظر في رمز Bytecode بتنسيق قابل للقراءة.
نرى مدونة أنطون أراوجوف الممتازة على أساسيات البرق
مثال مأخوذ من هناك للفصل:
public class Foo {
private String bar;
public String getBar(){
return bar;
}
...
... عوائد Bytecode:
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 و string inlining.