In diesem Artikel werden die Schritte des Java-Klassenlademechanismus vorgestellt. Bitte beachten Sie die folgenden Details.
Klassenlademechanismus
Eine Klasse beginnt mit dem Laden in den Speicher der virtuellen Maschine, bis sie aus dem Speicher entladen wird Der Lebenszyklus umfasst sieben Phasen: Laden, Überprüfung, Vorbereitung, Lösung, Initialisierung, Verwendung und Entladen. Die drei Teile der Überprüfung, Vorbereitung und Analyse werden zusammenfassend als Verknüpfen bezeichnet. Die Reihenfolge dieser sieben Phasen ist in der folgenden Abbildung dargestellt:
Zeitpunkt des Klassenladens
Aktive Referenz: Nachdem eine Klasse aktiv referenziert wurde, wird der Initialisierungsprozess ausgelöst (Laden, Überprüfung und Vorbereitung müssen vorher beginnen)
1) Wenn Sie auf Neues stoßen, getstatic, putstatic oder Wenn die Klasse bei Verwendung der vier Bytecode-Anweisungen von invokestatic noch nicht initialisiert wurde, muss ihre Initialisierung zuerst ausgelöst werden. Die häufigsten Java-Codeszenarien, die diese vier Anweisungen generieren, sind: Verwendung des Schlüsselworts new zum Instanziieren eines Objekts, Lesen oder Festlegen statischer Felder einer Klasse (mit Ausnahme von statischen Feldern, die von final geändert und von in den Konstantenpool eingefügt wurden). des Compilers) ) und beim Aufruf einer statischen Methode einer Klasse.
2) Wenn Sie die Methode des java.lang.reflect-Pakets verwenden, um einen reflektierenden Aufruf an eine Klasse durchzuführen, muss die Initialisierung zuerst ausgelöst werden, wenn die Klasse nicht initialisiert wurde.
3) Wenn Sie beim Initialisieren einer Klasse feststellen, dass die übergeordnete Klasse nicht initialisiert wurde, müssen Sie die Initialisierung der übergeordneten Klasse auslösen.
4) Wenn die virtuelle Maschine startet, muss der Benutzer eine Hauptklasse zur Ausführung angeben (die Klasse, die die Methode main() enthält), und die virtuelle Maschine initialisiert diese Klasse zuerst.
5) Bei Verwendung der dynamischen Sprachunterstützung von jdk7+, wenn das endgültige Analyseergebnis der java.lang.invoke.MethodHandle-Instanz das Methodenhandle von REF_getStatic, REF_putStatic, REF_invokeStatic und die dieser Methode entsprechende Klasse ist Das Handle wurde nicht initialisiert. Die Initialisierung erfordert zuerst eine Triggerinitialisierung.
Passive Referenz: Wenn eine Klasse eine passive Referenz ist, löst die Klasse den Initialisierungsprozess nicht aus
1) Der Verweis auf die statischen Felder der übergeordneten Klasse über die Unterklasse führt nicht zur Unterklasse initialisiert werden. Bei statischen Feldern wird nur die Klasse initialisiert, die das Feld direkt definiert. Wenn wir also über eine Unterklasse auf das in der übergeordneten Klasse definierte statische Feld verweisen, wird nur die Initialisierung der übergeordneten Klasse ausgelöst, nicht die Initialisierung der Unterklasse.
2) Der Verweis auf eine Klasse über eine Array-Definition löst nicht die Initialisierung dieser Klasse aus.
3) Konstanten werden während der Kompilierungsphase im Konstantenpool der aufrufenden Klasse gespeichert. Im Wesentlichen verweisen sie nicht direkt auf die Klasse, die die Konstante definiert, sondern auf die Initialisierung der Klasse, die die Konstante definiert wird nicht ausgelöst.
Das obige ist der detaillierte Inhalt vonWas ist der Java-Klassenlademechanismus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!