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“
„Es gibt viele Möglichkeiten, den Binärstrom einer Klasse über den vollständigen Klassennamen zu erhalten“
"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"
"Diese Phase der Verknüpfung ist hauptsächlich in drei Teile unterteilt: Überprüfung, Vorbereitung und Analyse"
" 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 folgt
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? ?
Klassen, Schnittstellen, Felder und Methoden in direkte Referenzen umwandeln 》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)
「执行类静态成员变量赋值语句和静态代码块中的语句」
我们把上面的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方法里面执行了哪些逻辑?从字节码的角度分析一波
「7e51f00a783d7eb8f68358439dee7daf方法」
从字节码可以看到7e51f00a783d7eb8f68358439dee7daf方法的主要逻辑为
「583d030be372af71281df966e84181a5方法」从字节码可以看到583d030be372af71281df966e84181a5方法的主要逻辑为
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 bestimmtKonstruktor
der nicht statische (konstruierter Codeblock, nicht -statische Mitgliedsvariablen) der Unterklasse, der Konstruktor der Unterklasse
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
Klassenladeprozess
Variablenzuweisungsprozess
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!