Klassenladen
Klassenladen bezieht sich auf die Methode, die Binärdaten in der .class-Datei der Klasse in den Speicher zu lesen und im Laufzeitdatenbereich abzulegen. Erstellen Sie dann ein java.lang.Class-Objekt im Heap-Bereich, um die Datenstruktur der Klasse im Methodenbereich zu kapseln.
Möglichkeiten zum Laden von .class-Dateien:
1. Direkt vom lokalen System laden
2. .class-Dateien über das Netzwerk herunterladen
3. Von Laden Sie .class-Dateien
aus ZIP-, JAR- und anderen Archivdateien 4. Extrahieren Sie .class-Dateien aus proprietären Datenbanken
5. Kompilieren Sie Java-Quelldateien dynamisch in .class-Dateien
Das Endprodukt des Klassenladens ist das Klassenobjekt, das sich im Heap-Bereich befindet.
Das Class-Objekt kapselt die Datenstruktur der Klasse im Methodenbereich und bietet Java-Programmierern eine Schnittstelle für den Zugriff auf die Datenstruktur im Methodenbereich.
Klassenlader
Es gibt zwei Arten von Ladern:
1. Der Lader, der mit der Java Virtual Machine geliefert wird
Root-Klassenlader (Bootstrap)
Erweiterungsklassenlader (Erweiterung)
Systemklassenlader oder Anwendungslader (System)
Die beiden letztgenannten Lader sind in Java implementiert, dem Root Der Klassenlader ist in C++ geschrieben und Programmierer können diese Klasse nicht in Java-Code abrufen.
2. Benutzerdefinierter Klassenlader
Unterklasse von java.lang.ClassLoader
Benutzer können die Lademethode von Klassen anpassen
Klassenladen Der Compiler muss nicht warten, bis eine Klasse zum ersten Mal aktiv verwendet wird, bevor sie geladen wird.
Die JVM-Spezifikation ermöglicht es dem Klassenlader, eine Klasse vorab zu laden, wenn sie voraussichtlich verwendet wird. Wenn die .class-Datei fehlt oder während des Vorladevorgangs ein Fehler auftritt, muss der Klassenlader geladen werden Es wird nur dann ein Fehler (LinkageError) gemeldet, wenn diese Klasse aktiv verwendet wird. Wenn die Klasse vom Programm nicht aktiv verwendet wurde, meldet der Klassenlader keinen Fehler.
Klassen-Entlademechanismus
Klassenlebenszyklus
Wenn die Beispielklasse geladen, verbunden und initialisiert wird, beginnt ihr Lebenszyklus.
Wenn auf das Klassenobjekt, das die Beispielklasse darstellt, nicht mehr verwiesen wird, das heißt, es nicht mehr zugänglich ist, beendet das Klassenobjekt seinen Lebenszyklus und die Daten der Beispielklasse im Methodenbereich werden ebenfalls entladen , wodurch die Lebensdauer der Sample-Klasse beendet wird.
Es ist ersichtlich, dass das Ende des Lebenszyklus einer Klasse davon abhängt, wann das sie darstellende Klassenobjekt seinen Lebenszyklus beendet.
Referenzbeziehung
Loader und Klassenobjekt:
In der internen Implementierung des Klassenladers wird eine Java-Sammlung verwendet, um Referenzen auf die geladenen Klassen zu speichern.
Andererseits verweist ein Klassenobjekt immer auf seinen Klassenlader. Rufen Sie die Methode getClassLoader() des Klassenobjekts auf, um dessen Klassenlader abzurufen.
Es ist ersichtlich, dass zwischen der Klasseninstanz und dem Loader, der sie lädt, eine wechselseitige Beziehung besteht.
Klasse, Klassenobjekt der Klasse, Instanzobjekt der Klasse:
Eine Instanz einer Klasse bezieht sich immer auf das Klassenobjekt, das die Klasse darstellt.
Die Methode getClass() ist in der Object-Klasse definiert. Diese Methode gibt einen Verweis auf das Class-Objekt zurück, das die Klasse darstellt, zu der das Objekt gehört.
Darüber hinaus verfügen alle Java-Klassen über ein statisches Attribut class, das auf das Klassenobjekt verweist, das diese Klasse darstellt.
Entladen von Klassen
Klassen, die vom Klassenlader geladen werden, der mit der Java Virtual Machine geliefert wird, werden während des Lebenszyklus der virtuellen Maschine niemals entladen.
Wie bereits erwähnt, umfassen die Klassenlader, die mit der Java Virtual Machine geliefert werden, den Stammklassenlader, den Erweiterungsklassenlader und den Systemklassenlader.
Die Java Virtual Machine selbst verweist immer auf diese Klassenlader, und diese Klassenlader beziehen sich immer auf die Klassenobjekte der Klassen, die sie laden, sodass diese Klassenobjekte immer erreichbar sind.
Von benutzerdefinierten Klassenladern geladene Klassen können entladen werden.
Spezifisches Beispiel
Die Variable „loader1“ und die Variable „obj“ wenden indirekt das Class-Objekt an, das die Sample-Klasse darstellt, während die Variable „objClass“ direkt darauf verweist.
Wenn während der Ausführung des Programms alle drei Referenzvariablen auf der linken Seite des obigen Bildes auf Null gesetzt werden, dann beendet das Sample-Objekt seinen Lebenszyklus, das MyClassLoader-Objekt beendet seinen Lebenszyklus und das Das Klassenobjekt, das die Sample-Klasse darstellt, beendet ebenfalls seinen Lebenszyklus. Die Binärdaten der Sample-Klasse im Methodenbereich werden entladen.
Bei Bedarf wird erneut geprüft, ob das Klassenobjekt der Beispielklasse vorhanden ist. Wenn es vorhanden ist, wird es direkt ohne erneutes Laden verwendet. Wenn die Beispielklasse nicht vorhanden ist, wird es neu geladen Die im Heap-Bereich der Java Virtual Machine generierte neue Klasseninstanz stellt die Beispielklasse dar (Sie können anhand des Hash-Codes überprüfen, ob es sich um dieselbe Instanz handelt).
Weitere Artikel zur Analyse des Lade- und Entlademechanismus von Java-Klassen aus der JVM finden Sie auf der chinesischen PHP-Website!