Für das Verständnis der JVM und ein tiefgreifendes Verständnis der Java-Sprache sind das Erlernen und Verstehen des Formats von Klassendateien wesentliche Lektionen
Die Position und Rolle von Klassendateien in Java Architektur
Um die JVM zu verstehen und die Java-Sprache tiefgreifend zu verstehen, müssen das Erlernen und Verstehen des Formats von Klassendateien beherrscht werden. Der Grund ist sehr einfach. Die JVM versteht die Java-Quelldateien nicht, bevor sie von der JVM erkannt werden können. Das Verständnis dieser Schnittstelle kann uns helfen, das Verhalten der JVM besser zu verstehen. Andererseits beschreibt die Klassendatei die Bedeutung, die wir in der Quelldatei ausdrücken möchten, auf andere Weise Wir haben geschrieben, dass ein tiefes Verständnis der Java-Sprache und -Grammatik sehr hilfreich ist. Unabhängig davon, um welche Sprache es sich handelt, kann sie von der JVM erkannt und ausgeführt werden, solange sie in eine Klassendatei kompiliert werden kann. Daher ist die Klassendatei nicht nur die Grundlage für die plattformübergreifende Kommunikation Das Verständnis der sprachübergreifenden JVM-Grundlagen ist für uns von entscheidender Bedeutung. Das Erlernen anderer JVM-Sprachen wäre eine große Hilfe.
Kurz gesagt, in der gesamten Java-Technologiearchitektur befinden sich Klassendateien in der Mitte und spielen eine verbindende Rolle beim Verständnis des gesamten Systems. Wie in der Abbildung gezeigt:
Übersicht über das Klassendateiformat
Klassendatei ist eine Bei einer 8-Bit-Binärstromdatei ist jedes Datenelement von vorne nach hinten dicht angeordnet, ohne Lücken zwischen benachbarten Elementen. Dadurch ist die Klassendatei sehr kompakt und leicht und kann von der JVM schnell in den Speicher geladen werden nimmt weniger Speicherplatz ein. Nachdem unsere Java-Quelldateien kompiliert wurden, belegt jede Klasse (oder Schnittstelle) eine separate Klassendatei, und alle Informationen in der Klasse verfügen über entsprechende Beschreibungen in der Klassendatei. Da Klassendateien sehr flexibel sind, sind sie sogar noch flexibler als Java-Quelldateien Dateien verfügen über stärkere Beschreibungsmöglichkeiten.
Die Informationen in der Klassendatei sind einzeln angeordnet. Einige davon belegen ein Byte, einige belegen zwei Bytes und einige belegen unterschiedliche Längen Die Datenelemente werden durch u1, u2, u4 bzw. u8 dargestellt, was angibt, dass ein Datenelement ein Byte, zwei Bytes, 4 Bytes bzw. 8 Bytes in der Klassendatei belegt. Sie können sich u1, u2, u3 und u4 als die „Typen“ von Klassendateidatenelementen vorstellen. Die folgenden Datenelemente sind in der Klassendatei
vorhanden (auf dieses Diagramm wird von „In-Depth Java Virtual Machine“ verwiesen):
Typ |
Name |
Menge |
u4 |
Magie |
1 |
u2 |
Nebenversion |
1 |
u2 |
Hauptversion |
1 |
u2 |
constant_pool_count |
1 |
cp_info |
constant_pool |
constant_pool_count - 1 |
u2 |
access_flags |
1 |
u2 |
this_class | 1 |
u2 |
Superklasse |
1 |
u2 |
interfaces_count |
1 |
u2 |
Schnittstellen |
interfaces_count |
u2 |
fields_count |
1 |
Feldinfo |
Felder |
fields_count |
u2 |
methods_count |
1 |
method_info |
methods |
methods_count |
u2 |
attribute_count |
1 |
attribute_info |
attributes |
attributes_count |
Im Folgenden finden Sie eine detaillierte Erläuterung jedes Elements in der Klassendatei.
Die magische Nummer und Versionsnummer in der Klassendatei
(1) Magie
befindet sich am Anfang der Klassendatei Die vier Bytes speichern die magische Nummer der Klassendatei. Diese magische Nummer ist das Symbol der Klassendatei. Es ist ein fester Wert: 0XCAFEBABE. Mit anderen Worten, es ist der Standard zur Beurteilung, ob eine Datei im Klassenformat vorliegt. Wenn die ersten vier Bytes nicht 0XCAFEBABE sind, bedeutet dies, dass es sich nicht um eine Klassendatei handelt und von der JVM nicht erkannt werden kann.
(2) Minor_version und Major_version
Die vier Bytes nach der magischen Zahl sind die Versionsnummer und die Hauptversionsnummer der Klassendatei. Mit der Weiterentwicklung von Java wird auch das Format der Klassendateien entsprechende Änderungen erfahren. Die Versionsnummer gibt an, wann die Klassendatei hinzugefügt oder geändert wurde. Beispielsweise können die Versionsnummern von Klassendateien, die von verschiedenen Versionen des Javac-Compilers kompiliert wurden, unterschiedlich sein, und die Versionsnummern von Klassendateien, die von verschiedenen Versionen von JVM erkannt werden, können im Allgemeinen auch unterschiedlich sein niedrigere Version Die vom Javac-Compiler kompilierten Klassendateien, aber die niedrigere Version der JVM kann die vom Javac-Compiler kompilierten Klassendateien nicht erkennen. Wenn Sie eine niedrigere Version der JVM verwenden, um eine höhere Version der Klassendatei auszuführen, löst die JVM einen java.lang.UnsupportedClassVersionError aus. Die spezifischen Änderungen der Versionsnummer werden hier nicht besprochen, und bedürftige Leser können die Informationen selbst einsehen.
Konstante in der KlassendateiPool-Übersicht
In der Klassendatei befindet sich der Konstantenpool nach der Version nummerbezogene Datenelemente. Der Konstantenpool ist ein sehr wichtiges Datenelement in der Klassendatei. Der Konstantenpool speichert Text Zeichenfolge , Konstantenwert, Klassennamen der aktuellen Klasse, Feldnamen, Methodennamen, Deskriptoren jedes Felds und jeder Methode, Referenzinformationen zu den Feldern und Methoden der aktuellen Klasse, aktuelle Referenz Informationen zu anderen Klassen in der Klasse usw. Der Konstantenpool enthält Beschreibungen fast aller Informationen in der Klasse. Viele andere Teile der Klassendatei sind Verweise auf Datenelemente im Konstantenpool, wie z. B. this_class, super_class, field_info, attribute_info usw. Darüber hinaus werden Bytes Es gibt auch einen Verweis auf den Konstantenpool in der Codeanweisung. Dieser Verweis auf den Konstantenpool wird als Operand des Bytecodebefehls verwendet. Darüber hinaus verweisen die einzelnen Elemente im Konstantenpool auch aufeinander.
Der Wert von konstant_pool_count in der Klassendatei ist 1, was bedeutet, dass jede Klasse nur einen Konstantenpool hat. Auch die Daten im Konstantenpool werden einzeln lückenlos entladen. Auf jedes Datenelement im Konstantenpool wird über index zugegriffen, was einem Array etwas ähnelt, mit der Ausnahme, dass der Index des ersten Elements im Konstantenpool 1 und nicht 0 ist, wenn an anderer Stelle darauf verwiesen wird Die Klassendatei Ein konstantes Poolelement mit dem Index 0 bedeutet, dass es auf kein konstantes Poolelement verweist. Jedes Datenelement in der Klassendatei hat seinen eigenen Typ. Ebenso hat jedes Datenelement im Konstantenpool seinen eigenen Typ. Die Datenelementtypen im Konstantenpool sind wie folgt:
|
Typflag | Typbeschreibung | ||||||||||||||||||||||||||||||||||||
CONSTANT_Utf8 | 1 | UTF -8 Kodierte Unicode-Zeichenfolge | ||||||||||||||||||||||||||||||||||||
CONSTANT_Integer | 3 | int-Typ-Literalwert | CONSTANT_Float | 4 | Float-Typ-Literalwert | |||||||||||||||||||||||||||||||||
CONSTANT_Long | 5 | Long-Type-Literal | ||||||||||||||||||||||||||||||||||||
CONSTANT_Double | 6 | double type literal | ||||||||||||||||||||||||||||||||||||
CONSTANT_Class | 7 | Ein symbolischer Verweis auf eine Klasse oder Schnittstelle | ||||||||||||||||||||||||||||||||||||
CONSTANT_String | 8 | String-Typ Literaler Wert | ||||||||||||||||||||||||||||||||||||
CONSTANT_Fieldref | 9 | Ein Symbol Verweis auf ein Feld | ||||||||||||||||||||||||||||||||||||
CONSTANT_Methodref | 10 | Eine symbolische Referenz auf eine in einer Klasse deklarierte Methode | ||||||||||||||||||||||||||||||||||||
CONSTANT_InterfaceMethodref | 11 | Symbolischer Verweis auf eine in einer Schnittstelle deklarierte Methode | ||||||||||||||||||||||||||||||||||||
CONSTANT_NameAndType | 12 | Teilweiser symbolischer Verweis auf ein Feld oder eine Methode |
Jedes Datenelement wird als XXX_info-Element bezeichnet. Ein Element vom Typ CONSTANT_Utf8 in einem Konstantenpool ist beispielsweise ein CONSTANT_Utf8_info. Darüber hinaus verfügt jedes Infoelement über einen Flag-Wert (Tag). Dieser Flag-Wert gibt den Typ des Info-Elements in diesem Konstantenpool an, wie aus der obigen Tabelle ersichtlich ist, dem Tag-Wert in einem CONSTANT_Utf8_info ist 1 und der Tag-Wert in einer CONSTANT_Fieldref_info ist 9.
Java-Programme werden dynamisch verknüpft. Bei der Implementierung der dynamischen Verknüpfung spielt der Konstantenpool eine zentrale Rolle. Zusätzlich zur Speicherung einiger Literale speichert der Konstantenpool auch die folgenden Arten von Symbolreferenzen:
(1) Vollqualifizierte Namen von Klassen und Schnittstellen
(2 ) Feldnamen und Deskriptoren
(3) Methodennamen und Deskriptoren
Bevor wir jedes Datenelement im Konstantenpool im Detail erklären, müssen wir zunächst etwas über Sonderzeichen Zeichenfolge in der Klassendatei, da im Konstantenpool Sonderzeichenfolgen in großer Zahl vorkommen. Diese Sonderzeichenfolgen sind die oben genannten vollständig qualifizierten Namen und Deskriptoren. Um jedes Datenelement im Konstantenpool zu verstehen, müssen Sie zunächst diese speziellen Zeichenfolgen verstehen.
Das obige ist der detaillierte Inhalt vonDetaillierte grafische Erläuterung des Klassendateiformats in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!