Frage

In welchem Abschnitt einer kompilierten Klasse Werden Abhängigkeiten zu anderen Klassen (die Importe) gespeichert und können sie angezeigt werden (mit einem Editor oder etwas nicht programmatisch)?

Vielen Dank,

War es hilfreich?

Lösung

Dies wird im "konstanten Pool" der Klasse gespeichert (zusammen mit allem anderen, Klassen und Methodennamen usw.).

Sie würden Javap verwenden, um den Bytecode in einem lesbaren Format zu betrachten.

Sehen Anton Arhipovs ausgezeichneter Blog über Bytecode -Grundlagen

Ein Beispiel von dort für den Unterricht:

public class Foo {
    private String bar;

    public String getBar(){ 
      return bar; 
    }
    ...

... ergibt Bytecode:

public java.lang.String getBar();
  Code:
   0:   aload_0
   1:   getfield        #2; //Field bar:Ljava/lang/String;
   4:   areturn

Und hat einen konstanten Pool:

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;

Sie können den Verweis auf verfolgen String aus Foo#getBar durch den konstanten Pool als:

  • Getfield #2
  • wobei #2 ein Feld ist, in Bezug auf #3. #18
    • wobei #3 die Klasse #19 referenziert
      • Welches ist Klasse Foo
    • und #18 ist ein Namensschiff -Referenzieren Nr. 5 und #6
      • und #5 ist Bar (Feld)
      • und #6 ist der Verweis auf java.lang.String

Ich empfehle dringend, Antons Blog zu lesen. Es ist wirklich gut gemacht!

Ich würde auch lesen James D. Blooms JVM -Interna -Artikel wie es viele JVM -interne Architektur abdeckt. Beachten Sie jedoch Daten und Versionen, auf die sich die Dinge ändern (z.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top