Die JAVA-Quellcode-Kompilierung besteht aus drei Prozessen:
1. Quellcode-Kompilierungsmechanismus.
2. Klassenlademechanismus
3. Klassenausführungsmechanismus
Hier stellen wir hauptsächlich die beiden Mechanismen der Kompilierung und des Klassenladens vor.
1. Quellcode-Kompilierung
Die Codekompilierung wird durch den JAVA-Quellcode-Compiler abgeschlossen. Der Hauptzweck besteht darin, den Quellcode in eine Bytecode-Datei (Klassendatei) zu kompilieren. Das Bytecode-Dateiformat ist hauptsächlich in zwei Teile unterteilt: Konstantenpool und Methodenbytecode.
2. Klassenladen
Der Lebenszyklus einer Klasse beginnt mit dem Laden in den Speicher der virtuellen Maschine und endet, wenn sie aus dem Speicher entladen wird. Es gibt sieben Phasen im Prozess, von denen der Teil vor der Initialisierung der Teil des Klassenladens ist
Laden ----Überprüfung ----Vorbereitung ----Analyse -----Initialisierung-- -- Verwenden Sie -----Uninstall
Das System lädt möglicherweise eine Klasse, wenn sie zum ersten Mal verwendet wird, oder es verwendet möglicherweise einen Vorlademechanismus, um eine Klasse zu laden, wenn ein bestimmtes Java-Programm ausgeführt wird. Es wird ein Java Virtual Machine-Prozess gestartet. Das Java-Programm, das zweimal ausgeführt wird, befindet sich in zwei verschiedenen JVM-Prozessen und die Daten werden nicht zwischen den beiden JVMs gemeinsam genutzt.
1. Ladephase
Das Laden in diesem Prozess ist eine Phase im Klassenlademechanismus. Die Dinge, die in dieser Phase abgeschlossen werden müssen, sind: >
1) Erhalten Sie den binären Bytestrom, der diese Klasse definiert, über den vollständig qualifizierten Namen einer Klasse. 2) Konvertieren Sie die durch diesen Bytestream dargestellte statische Speicherstruktur in eine Laufzeitdatenstruktur im Methodenbereich. 3) Generieren Sie ein Klassenobjekt, das diese Klasse im Java-Heap darstellt, als Eingang für den Zugriff auf die Daten im Methodenbereich. Da der erste Punkt nicht angibt, wo und wie der binäre Bytestrom der Klasse abgerufen werden kann, lässt dieser Bereich meinen Entwicklern viel Spielraum. Ich werde dies später im Klassenlader vorstellen. 2. Vorbereitungsphase Diese Phase weist formal Speicher für Klassenvariablen zu (Variablen, die durch statische Variablen geändert werden) und legt den Anfangswert der Klassenvariablen fest. Diese Speicherzuweisung erfolgt im Methodenbereich. 1. Beachten Sie, dass beim Instanziieren des Objekts keine Speicherzuweisung für Instanzvariablen erfolgt. 2. Der hier eingestellte Anfangswert bezieht sich normalerweise auf den Nullwert des Datentyps. private static int a = 3; Der Wert der Variablen a dieser Klasse ist nach der Vorbereitungsphase 0. Die Zuweisung von 3 an die Variable a erfolgt in der Initialisierungsphase.
new Test(); Class.forName(“com.mengdd.Test”);2) Rufen Sie eine Klassenmethode (statische Methode) einer Klasse auf
Test.doSomething();3) Greifen Sie auf eine Klassenvariable einer Klasse oder Schnittstelle zu, oder Weisen Sie diesem Variablentyp einen Wert zu.
int b=Test.a; Test.a=b;4) Initialisieren Sie eine Unterklasse einer bestimmten Klasse. Wenn eine Unterklasse initialisiert wird, werden alle übergeordneten Klassen der Unterklasse initialisiert. 5) Verwenden Sie direkt den Befehl java.exe, um eine Hauptklasse auszuführen. Mit Ausnahme der oben genannten Methoden, die eine Klasse automatisch initialisieren, lösen andere Methoden für den Zugriff auf eine Klasse nicht die Initialisierung der Klasse aus und werden als passive Referenzen bezeichnet. 1. Unterklassen beziehen sich auf statische Variablen der übergeordneten Klasse, wodurch die Unterklasse nicht initialisiert wird.
public class SupClass { public static int a = 123; static { System.out.println("supclass init"); } } public class SubClass extends SupClass { static { System.out.println("subclass init"); } } public class Test { public static void main(String[] args) { System.out.println(SubClass.a); } }Ausführungsergebnis: supclass init
123
public class SupClass { public static int a = 123; static { System.out.println("supclass init"); } } public class Test { public static void main(String[] args) { SupClass[] spc = new SupClass[10]; } }Ausführungsergebnis:
public class ConstClass { public static final String A= "MIGU"; static { System.out.println("ConstCLass init"); } } public class TestMain { public static void main(String[] args) { System.out.println(ConstClass.A); } }Ausführungsergebnis: MIGU