Heim  >  Artikel  >  Java  >  Interviewer: Erzählen Sie mir etwas über den Klassenladeprozess (10 Diagramme)

Interviewer: Erzählen Sie mir etwas über den Klassenladeprozess (10 Diagramme)

Java后端技术全栈
Java后端技术全栈nach vorne
2023-08-23 15:05:471572Durchsuche

Laden

Wenn wir eine Klasse verwenden möchten, müssen wir die Klasse über ClassLoader in den Speicher laden

„Die Klassenladephase erledigt hauptsächlich die folgenden drei Dinge“

  1. Erhalten Sie den Binärstrom der Klasse über den vollständigen Klassennamen.
  2. Parsen Sie den Binärstrom der Klasse in die Datenstruktur im Methodenbereich.
  3. Erstellen Sie eine Instanz der Klasse java.lang.Class zur Darstellung der Typ, als Methodenbereich Klassenzugriffseingang
Interviewer: Erzählen Sie mir etwas über den Klassenladeprozess (10 Diagramme)

„Es gibt viele Möglichkeiten, den Binärstrom einer Klasse über den vollständigen Klassennamen zu erhalten“

  1. Holen Sie es sich aus dem Zip-Paket
  2. Holen Sie es sich aus dem Netzwerk
  3. Laufzeitberechnungsgenerierung, z. B. dynamische Proxy-Technologie
  4. ...

"Für die Ladephase von Nicht-Array-Typen können Sie die integrierte Funktion verwenden Klassenlader der Java Virtual Machine zum Vervollständigen, oder Sie können den vom Benutzer angepassten Klassenlader zum Vervollständigen verwenden"

Link

"Diese Phase der Verknüpfung ist hauptsächlich in drei Teile unterteilt: Überprüfung, Vorbereitung und Analyse"

Verifizierung

" Die Verifizierungsphase ist Hauptsächlich, um sicherzustellen, dass das Dateiformat der Klasse korrekt ist und die Sicherheit der virtuellen Maschine beim Ausführen nicht gefährdet „Ich werde die spezifischen Details nicht im Detail erklären, Sie können sehen“ „Detailliertes Verständnis der Java Virtual Machine“, dieser Artikel zieht es vor, eine Zusammenfassung zu erstellen und den gesamten Prozess des Ladens von Klassen zu erfassen, ohne auf die Details einzugehen für die statischen Variablen der Klasse und initialisieren Sie sie mit Standardwerten"

Die Standardwerte gängiger Datentypen sind wie folgtInterviewer: Erzählen Sie mir etwas über den Klassenladeprozess (10 Diagramme)

Datentyp Standardwert
byte (byte)0
short (short)0
int 0
lang 0L
float 0.0f
double 0.0d
boolean false
char 'u0000'
Referenz null

"Wenn das ConstantValue-Attribut in der Feldattributtabelle der statischen Klassenvariablen vorhanden ist, wird die Zuweisungsanweisung direkt ausgeführt"

Unter welchen Umständen ist das ConstantValue-Attribut in der Feldattributtabelle der statischen Klassenvariablen vorhanden? ?

  1. Statische Klassenvariablen sind grundlegende Datentypen und werden durch final geändert.
  2. Statische Klassenvariablen sind vom Typ String, werden durch final geändert und ihnen werden Werte in Form von Literalen zugewiesen. Der Reihe nach Um die Anzeige der Bytes des Klassendateicodes zu erleichtern, habe ich in IDEA einen Plug-in-Jclasslib-Bytecode-Viewer heruntergeladen, der sehr praktisch ist. Verwenden Sie den folgenden Code, um ihn in Form eines Bytecodes zu überprüfen Alters- und Ortsattribute werden zugewiesen? ? Es befindet sich in der Initialisierungsphase, die später im Detail vorgestellt wird.

Klassen, Schnittstellen, Felder und Methoden in direkte Referenzen umwandeln 》Interviewer: Erzählen Sie mir etwas über den Klassenladeprozess (10 Diagramme)Symbolische Referenz: Verwenden Sie eine Reihe von Symbolen, um das referenzierte Ziel zu beschreiben Direkter Verweis; direkter Zeiger auf das ZielKommen Sie mit und schreiben Sie eine Klasse wie folgt

public class Person {

    private static int age = 10;
    private static final int length = 160;
    private static final String name = "name";
    private static final String loc = new String("loc");
}

Am Beispiel von Feldern verweisen die dem Namen und dem Alter entsprechenden Objekte nicht direkt auf die Speicheradresse, sondern werden mit Zeichenfolgen beschrieben ( d.h. symbolische Referenz). Die Parsing-Phase besteht darin, diese Beschreibungen in Zeiger umzuwandeln, die direkt auf das Ziel verweisen (d. h. direkte Referenzen)

初始化

「执行类静态成员变量赋值语句和静态代码块中的语句」

Interviewer: Erzählen Sie mir etwas über den Klassenladeprozess (10 Diagramme)

我们把上面的Student代码改成如下形式

public class Student {

    private String name;
    private int age = 10;
    private static int gender = 1;

    {
        System.out.println("构造代码块");
    }

    static {
        System.out.println("静态代码块");
    }

    public Student() {
        System.out.println("构造函数");
    }

    public String getName() {
        return this.name;
    }
}

可以看到字节码中包含了3个方法,getName方法我们知道,7e51f00a783d7eb8f68358439dee7daf和583d030be372af71281df966e84181a5方法里面执行了哪些逻辑?Interviewer: Erzählen Sie mir etwas über den Klassenladeprozess (10 Diagramme)从字节码的角度分析一波

「7e51f00a783d7eb8f68358439dee7daf方法」

Interviewer: Erzählen Sie mir etwas über den Klassenladeprozess (10 Diagramme)

从字节码可以看到7e51f00a783d7eb8f68358439dee7daf方法的主要逻辑为

  1. 调用父类的7e51f00a783d7eb8f68358439dee7daf方法
  2. 非静态成员变量赋值
  3. 执行构造代码块
  4. 执行构造函数

Interviewer: Erzählen Sie mir etwas über den Klassenladeprozess (10 Diagramme)「583d030be372af71281df966e84181a5方法」Interviewer: Erzählen Sie mir etwas über den Klassenladeprozess (10 Diagramme)从字节码可以看到583d030be372af71281df966e84181a5方法的主要逻辑为

  1. Führen Sie die Zuweisungsanweisung der statischen Variablen aus.
  2. Führen Sie die Anweisung im statischen Codeblock aus ausgeführt wird, wird die Methode f7729255ed3b5adeaf95ded0aa3581a1 der übergeordneten Klasse ausgeführt. Es ist immer noch notwendig, die Rolle der Methoden 583d030be372af71281df966e84181a5 über statische Codeblöcke, konstruierte Codeblöcke und konstruierte Die Ausführungsreihenfolge von Funktionen „
  3. Ich werde die Schlussfolgerung hier direkt zusammenfassen. Sie können eine Demo schreiben, um sie zu überprüfen
    „Ausführungsreihenfolge ohne Vererbung“

Statische Codeblöcke und statische Mitgliedsvariablen, die Ausführungsreihenfolge wird durch die Schreibreihenfolge bestimmt (sie wird nur einmal ausgeführt)

Erstellen Sie Codeblöcke und nicht statische Mitgliedsvariablen, die Ausführungsreihenfolge wird durch die Schreibreihenfolge bestimmt

Konstruktor
  1. „Ausführungsreihenfolge mit Vererbung“
  2. Statisch (statischer Codeblock, statische Mitgliedsvariablen) der übergeordneten Klasse, statisch (statischer Codeblock, statische Mitgliedsvariablen) der Unterklasse ( wird nur einmal ausgeführt)
Nicht statisch (konstruierter Codeblock) der übergeordneten Klasse, nicht statische Mitgliedsvariablen), der Konstruktor der übergeordneten Klasse

der nicht statische (konstruierter Codeblock, nicht -statische Mitgliedsvariablen) der Unterklasse, der Konstruktor der Unterklasse
  1. Unloading
  2. Die Garbage Collection erfolgt nicht nur im Heap, sondern auch im Methodenbereich. Die Bedingungen für das Recycling von Typdaten im Methodenbereich sind jedoch recht streng. Die folgende Abbildung ist ein Beispiel dafür, dass ich die Simple-Klasse im Methodenbereich recyceln möchte
    1. Sie müssen sicherstellen, dass die Sample-Klasse und ihre Unterklassen im Heap recycelt wurden
    2. Der MyClassLoader, der die Sample-Klasse lädt, wurde recycelt
    3. Das der Sample-Klasse entsprechende Klassenobjekt wurde recyceltInterviewer: Erzählen Sie mir etwas über den Klassenladeprozess (10 Diagramme)

    Sie können sehen, dass die Bedingungen für das Recycling von Typdaten im Methodenbereich relativ hart sind, die Ergebnisse jedoch minimal sind, sodass einige Garbage Collectors die Typdaten im Methodenbereich nicht recyceln

    Zusammenfassung

    KlassenladeprozessInterviewer: Erzählen Sie mir etwas über den Klassenladeprozess (10 Diagramme)

    VariablenzuweisungsprozessInterviewer: Erzählen Sie mir etwas über den Klassenladeprozess (10 Diagramme)

Das obige ist der detaillierte Inhalt vonInterviewer: Erzählen Sie mir etwas über den Klassenladeprozess (10 Diagramme). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:Java后端技术全栈. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen