Heim  >  Artikel  >  Java  >  Detaillierte grafische Erläuterung des Klassendateiformats in Java

Detaillierte grafische Erläuterung des Klassendateiformats in Java

黄舟
黄舟Original
2017-06-18 09:45:321857Durchsuche

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:

常量池中数据项类型

类型标志

类型描述

CONSTANT_Utf8

1

UTF-8编码的Unicode字符串

CONSTANT_Integer

3

int类型字面值

CONSTANT_Float

4

float类型字面值

CONSTANT_Long

5

long类型字面值

CONSTANT_Double

6

double类型字面值

CONSTANT_Class

7

对一个类或接口的符号引用

CONSTANT_String

8

String类型字面值

CONSTANT_Fieldref

9

对一个字段的符号引用

CONSTANT_Methodref

10

对一个类中声明的方法的符号引用

CONSTANT_InterfaceMethodref

11

对一个接口中声明的方法的符号引用

CONSTANT_NameAndType

12

对一个字段或方法的部分符号引用

Konstanter Pool Mittlerer Datenelementtyp
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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn