Detaillierte Einführung in den Grundprozess für Java -Klasse
Grundprozess:
- Laden Sie den binären Byte -Stream, der die Klasse basierend auf dem voll qualifizierten Namen der Klasse definiert.
- Konvertieren Sie die statische Speicherstruktur, die vom Byte -Stream in die Laufzeitdatenstruktur des Methodenbereichs dargestellt wird
- Generieren Sie ein java.lang.class -Objekt, das diese Klasse im Speicher darstellt, und verwenden Sie sie als Methode, um auf verschiedene Datenzugriffsportale dieser Klasse zuzugreifen.
Die Array -Klasse selbst wird nicht über den Klassenlader erstellt, sondern direkt von der virtuellen Java -Maschine erstellt, und der Elementtyp der Array -Klasse wird vom Klassenloader geladen.
Elementtyp der Array -Klasse: Die Art des Arrays nach Entfernen aller Dimensionen.
Überprüfung der Dateiformat:
- 0xcafebaby beginnt mit magischer Nummer;
- Die aktuelle virtuelle Maschine kann die primäre und sekundäre Versionsnummer verarbeiten.
- konstanter Typ;
- Indexausführungstyp;
- UTF8 codierter Datentyp,
Metadatenüberprüfung: Semantische Analyse von Bytecode -Beschreibung Informationen:
- Ob es eine Elternklasse gibt;
- Ob die übergeordnete Klasse die endgültige modifizierte Klasse erbt;
- Ob eine nicht extrahierte Klasse die Methoden implementiert, die in der übergeordneten Klasse oder Schnittstelle implementiert werden müssen;
- Überschreibe von Feldern und Methoden in der Klasse, Überlastung Widersprüche;
Bytecode -Überprüfung: Bestimmen Sie die Rechtmäßigkeit und Korrektheit des Programms durch semantische Durchfluss- und Kontrollflussanalyse sowie Verifizierung der Methodenkörperanalyse.
- Symbolreferenzüberprüfung: Wenn die virtuelle Maschine die Symbolreferenz in direkte Referenz umwandelt, führt sie in der Analysestufe übereinstimmende Überprüfung der Informationen außerhalb der Klasse selbst durch.
- Ob die entsprechende Klasse durch vollständig qualifizierte Namen gefunden werden kann, die durch Zeichen in symbolischen Referenzen beschrieben werden;
- Gibt an, ob es Deskriptoren in der Klasse gibt, die dem Feld Methoden sowie Methoden und Felder übereinstimmen, die im einfachen Namen beschrieben werden.
- Zugänglichkeit von Klassen, Feldern und Methoden in symbolischen Referenzen.
Vorbereitung: Zuwach für Klassenvariablen im Methodenbereich zuweisen und den Anfangswert von Klassenvariablen festlegen.
- Der Anfangswert ist normalerweise der Nullwert des Datentyps, und der endgültige geänderte Wert wird direkt in den entsprechenden Wert initialisiert.
- Klassenvariablen sind statisch modifizierte Variablen, die von Instanzvariablen unterschieden werden.
Analyse: Die virtuelle Maschine ersetzt symbolische Referenzen im konstanten Pool durch direkten Referenzprozess
Constant_class_info, constant_fieldref_info, constant_methodref_info ..
- Symbolreferenz: Ein Satz von Symbolen beschreibt das referenzierte Ziel. Jede Form von Literalen kann verwendet werden, um das Ziel ohne Mehrdeutigkeit zu lokalisieren. Es hat nichts mit der Implementierung der virtuellen Maschinespeicher und unabhängig davon, ob das Referenzziel geladen ist.
- Direkte Referenz: Ein Zeiger direkt auf das Ziel, ein Offset oder ein indirekt an das Ziel befindlicher Griff hängt mit dem von der virtuellen Maschine implementierten Speicher zusammen. Das direkt verwandte Zielobjekt muss geladen werden.
- . . .
Initialisierung: Führen Sie den Java -Programmcode in der Klassendefinition aus. Führen Sie die Methode der Klassenkonstruktor <kinit> () aus, aus,
<Cinit> ():
- Der Compiler sammelt automatisch die Zuordnungsaktionen von Klassenvariablen in der Klasse gemäß der Definitionsreihenfolge in der Klassendatei und verschmilzt die Aussagen des statischen Anweisungsblocks. Der statische Anweisungsblock kann nur auf die zuvor definierten Variablen zugreifen.
- Anders als der Klassenkonstruktor muss der übergeordnete Klassenkonstruktor nicht wie gezeigt aufgerufen werden. Die virtuelle Maschine stellt sicher, dass die übergeordnete Klasse <Cinit> () ausgeführt wurde, bevor die Unterklasse ausgeführt wird.
- Der statische Anweisungsblock in der übergeordneten Klasse wird zuerst ausgeführt.
- <Cinit> () ist für Klassen oder Schnittstellen nicht erforderlich und wird nicht generiert, wenn keine variable Zuweisungsoperation oder statische Anweisung Block vorliegt.
- Die <Cinit> () der Schnittstelle muss nicht zuerst die <kinit> () der übergeordneten Schnittstelle ausführen, und dieselbe Schnittstellen -Implementierungsklasse <Cinit> () ist nicht erforderlich.
- Gewindesicherheit: Die virtuelle Maschine stellt sicher, dass <Cinit> () in einer Umgebung mit mehreren Threaden korrekt gesperrt und synchronisiert ist. Nur ein Thread kann gleichzeitig auf die <kinit> () der Initialisierungsklasse zugreifen.
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!