سؤال

بحيث قسم من الفصل المترجم هل يتم تخزين التبعيات لفئات أخرى (الواردات) وهل يمكن عرضها (مع محرر أو شيء غير برمجي)؟

شكرًا،

هل كانت مفيدة؟

المحلول

يتم تخزين هذا في "التجمع الثابت" للفئة (إلى جانب كل شيء آخر ، والفئات وأسماء الأسلوب ، وما إلى ذلك).

يمكنك استخدام 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

أنصح بشدة قراءة مدونة أنطون. لقد تم إجراؤه جيدًا!

سأقرأ أيضا مقال جيمس دي بلوم في jvm internals لأنه يغطي الكثير من الهندسة المعمارية الداخلية JVM. كن على دراية بالتواريخ والإصدارات المشار إليها على الرغم من أن الأمور تتغير (مثل استخدام كومة Java في Java 8 و string inlining.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top