1. Was ist eine Java-Klassendatei?
Eine Java-Klassendatei ist eine binäre Darstellung eines Java-Programms. Jede Klassendatei repräsentiert eine Klasse oder Schnittstelle. Es ist nicht möglich, mehrere Klassen oder Schnittstellen in einer Klassendatei abzulegen. Dadurch kann die Klassendatei auf jedem Host ausgeführt werden, unabhängig von der Plattform, auf der sie generiert wird.
Obwohl Klassendateien Teil der Java-Architektur sind, sind sie nicht untrennbar mit der Java-Sprache verbunden. Sie können Programme in anderen Sprachen in Klassendateien kompilieren und Java-Programmdateien in andere Binärformen kompilieren.
Java-Klassendatei ist ein Binärstream, der auf 8-Bit-Bytes basiert. Datenblöcke werden im sequentiellen Big-Endian-Format ohne Trennzeichen gespeichert.
2. Inhalte von Klassendateien
Java-Klassendateien enthalten alle Informationen über Klassen und Schnittstellen, die von der Java Virtual Machine benötigt werden. Die Informationen in allen Klassendateien werden in den folgenden vier Grundtypen gespeichert:
Tabelle 6-1. Klassendatei „PRimitive Typen“
u1 ein einzelnes vorzeichenloses Byte
u2 zwei vorzeichenlose Bytes
u4 vier vorzeichenlose Bytes
u8 acht vorzeichenlose Bytes
Die Hauptteile der Klassendatei werden in der Reihenfolge von Tabelle 6-2 gespeichert:
Tabelle 6-2. Format einer ClassFile-Tabelle
Typ& #9;Name Count
u4 magic 1
u2 Minor_version 1
u2 Major_version 1
u2 Constant_pool_count Constant 1
cp_info Constant_pool_count-1
u2 access_flags 1
u2 this_class 1
u2 super_class 1
u2 interfaces_count 1
u2 interfaces interfaces_count
u2 Fields_count 1
field_info Fields Fields_count
u2 Methods_count 1
Method_ Info Methods Methods_Count
u2 Attributes_Count 1
Attribute_Info Attribute Attribute attributes_count
1. Magische Kodierung (magic)
Die ersten vier Bytes jeder Java-Klassendatei sind magische Kodierung (OxCAFEBABE). Klassendateien können durch magische Kodierung leicht identifiziert werden.
2. Minor_version und Major_version (Minor_version und Major_version)
Die verbleibenden vier Bytes sind die Nebenversionsnummer und die Hauptversionsnummer. Mit der Weiterentwicklung der Java-Technologie werden den Klassendateien jedoch möglicherweise einige neue Funktionen hinzugefügt. Jedes Mal, wenn sich das Klassendateiformat ändert, ändert sich die Versionsnummer entsprechend. Die virtuelle Maschine verwendet die Versionsnummer, um die Klassendateien zu identifizieren, die sie verarbeiten kann. Die Java Virtual Machine kann oft nur eine bestimmte Hauptversionsnummer und einige darunter liegende Nebenversionsnummern verarbeiten. Die virtuelle Maschine muss Klassendateien ablehnen, die nicht mehr verarbeitet werden können.
3. Constant_pool_count und Constant_pool
Als nächstes folgt der Konstantenpool. Der Konstantenpool enthält Konstanten, auf die von Klassen oder Schnittstellen zugegriffen wurde, wie zum Beispiel: Zeichenfolgen, Konstanten (endgültige Variablenwerte), Klassenname, Methodenname. Der Konstantenpool wird als Liste gespeichert. Die Anzahl der Konstanten in der Liste ist der zuvor gespeicherte „constant_pool_count“.
Viele Konstanten im Konstantenpool verweisen auf andere Konstanten im Konstantenpool, und diese Verweise auf Konstantenpoolkonstanten werden schließlich in direkte Verweise auf die Konstanten im Konstantenpool umgewandelt. Obwohl der Index in der Konstantenliste bei 1 beginnt, umfasst die Anzahl der Konstanten immer noch 0. Wenn eine Konstantenliste beispielsweise 15 Konstanten enthält, beträgt die Anzahl der Konstanten 16.
Jede Konstante hat am Anfang ein Flag, das ihren Typ angibt. Wenn die virtuelle Maschine dieses Flag liest, kennt sie den spezifischen Typ dieser Konstante. Tabelle 6-3 listet diese Flags auf:
Tabelle 6-3. Konstanten-Pool-Tags
Eintragstyp-Tag-Wert-Beschreibung
CONSTANT_Utf8 1 Eine UTF-8-codierte Unicode-Zeichenfolge
CONSTANT_Integer 3 Ein int-Literalwert
CONSTANT_Float 4 Ein Float-Literalwert
CONSTANT_Long 5 Ein Long-Literalwert
CONSTANT_Double 6 Ein Double-Literalwert
CONSTANT_Class 7 Ein symbolischer Verweis auf eine Klasse oder Schnittstelle
CONSTANT_String 8 Ein String-Literalwert
CONSTANT_Fieldref 9 Ein symbolischer Verweis auf ein Feld
CONSTANT_Methodref 10 Ein symbolischer Verweis auf eine in einer Klasse deklarierte Methode
CONSTANT_InterfaceMethodref 11 Ein symbolischer Verweis auf eine in einer Schnittstelle deklarierte Methode
CONSTANT_NameAndType 12 Teil einer symbolischen Referenz auf ein Feld oder eine Methode
Jedes Flag in Tabelle 6-3 verfügt über eine entsprechende Tabelle zur Beschreibung einiger spezifischer Informationen, die durch dieses Flag dargestellt werden. Der Flagname endet mit +_INFO. Beispielsweise entspricht das Flag CONSTANT_CLASS CONSTANT_CLASS_INFO.
Der konstante Pool spielt eine sehr wichtige Rolle bei der dynamischen Verknüpfung von Programmen. Zusätzlich zu den verschiedenen oben genannten Konstantenwerten enthält der Konstantenpool die folgenden drei Arten von Symbolreferenzen: vollständige Namen von Klassen und Schnittstellen, Feldnamen und Deskriptoren sowie Methodennamen und Deskriptoren. Ein Feld ist eine Instanz oder Klassenvariable in einer Klasse oder Schnittstelle, und der Felddeskriptor ist der Typ des Feldes. Der Methodendeskriptor ist die Anzahl, Reihenfolge und Art der Methode sowie der Rückgabewert und die Parameter. Diese vollständigen Namen werden von der virtuellen Maschine verwendet, wenn sie diese Klasse oder Schnittstelle mit anderen Klassen oder Schnittstellen verknüpft. Da die Klassendatei keine Informationen über die Speicherstruktur enthält, kann dieser Link nur in Form einer symbolischen Referenz existieren. Die virtuelle Maschine wandelt diese symbolischen Referenzen während der Ausführung in tatsächliche Adressen um. Spezifische Informationen finden Sie in Kapitel 8 „Das Verknüpfungsmodell“.
4. Zugriffsflags (access_flags)
Die beiden Bytes unmittelbar nach dem Konstantenpool sind Zugriffsflags, die verschiedene Aspekte von Informationen über diese Klasse oder Schnittstelle darstellen. Sie haben die folgenden Werte:
Tabelle 6 -4 . Flag-Bits im Element „access_flags“ von ClassFile-Tabellen
Flag-Name Wert Bedeutung, wenn Set Set By
ACC_PUBLIC 0x0001 Typ ist öffentliche Klassen und Schnittstellen
ACC_FINAL 0x0010 Klasse ist nur finale Klassen
ACC_SUPER 0x0020 Neues invokespecial verwenden SemantikKlassen und Schnittstellen
ACC_INTERFACE 0x0200 Typ ist eine Schnittstelle, keine Klasse Alle Schnittstellen, keine Klassen
ACC_ABSTRACT 0x0400 Typ ist abstrakt Alle Schnittstellen, einige Klassen
Das ACC_SUPER-Flag dient der Kompatibilität mit dem alten SUN-Kompilierungsgerät. Alle nicht verwendeten Zugriffsflags müssen auf 0 gesetzt werden.
5. Klassenname (this_class)
Die nächsten zwei Bytes speichern den Index eines Konstantenpools. Entitäten in diesem Konstantenpool müssen vom Typ CONSTANT_CLSS_INTO sein, der Flag- und Namensindizes enthält. Das Flag ist CONSTATN_CLASS und der Namensindex sollte ein Index vom Typ CONSTANT_UTF8_INFO sein, der den vollständigen Namen der Klasse oder Schnittstelle speichert.
6. Übergeordnete Klasse (super_class)
Nach this_class steht die Zwei-Byte-super_class. Es ist auch ein Index des Konstantenpools, der den vollständigen Namen der übergeordneten Klasse speichert. Er wird genauso verarbeitet wie this_class. Wenn die übergeordnete Klasse java.lang.Object ist, sollte super_class 0 sein. Für die Schnittstelle ist super_class 0.
7. (interfaces_count und interfaces)
interfaces_count speichert die Anzahl der übergeordneten Schnittstellen und interfaces speichert einige konstante Poolindizes in Form eines Arrays. Jeder Index verweist auf eine CONSTANT_CLASS_INFO-Konstante, die den vollständigen Namen jeder übergeordneten Schnittstelle speichert. Die Reihenfolge dieses Arrays ist die Reihenfolge von links nach rechts, in der die übergeordnete Schnittstelle in den Implements- und Extends-Anweisungen erscheint.
8. (Felder_Anzahl und Felder)
Felder werden in einer Liste von Feldinformationen gespeichert, Felder_Anzahl ist die Länge dieser Liste. Nur die in der Klasse oder Schnittstelle deklarierten Variablen werden in der Field_info-Liste gespeichert. Von der übergeordneten Klasse oder der übergeordneten Schnittstelle geerbte Felder werden hier nicht gespeichert.
Jeder Eintrag in der Tabelle „field_info“ beschreibt die Informationen eines Feldes, einschließlich: Feldname, Deskriptor und Zugriffsberechtigungen. Wenn ein Feld als endgültig deklariert wird, werden die Informationen zu diesem Feld in der Tabelle field_info und auch im Konstantenpool gespeichert.
9. (methods_count und Methoden)
Methodeninformationen werden in der Tabelle method_info gespeichert, mehtods_count ist die Länge der Tabelle. In der Method_info-Tabelle werden nur Methoden gespeichert, die in Klassen oder Schnittstellen deklariert wurden, und keine Methoden, die von übergeordneten Klassen oder Schnittstellen geerbt wurden.
메소드 이름과 설명자(반환 값 및 매개변수 유형)는 Method_info 테이블에 저장됩니다. 추상 메소드가 아닌 경우 스택의 크기(지역 변수를 저장하는 데 사용됨), 피연산자 스택의 최대 크기, catch된 예외 목록, 메소드의 바이트 코드, 선택적 라인 번호 및 지역 변수 테이블은 다음과 같습니다. 또한 저장되었습니다. 메서드가 일부 확인된 예외를 발생시키는 경우 method_info에는 확인된 예외 목록도 포함됩니다.
10. (attributes_count 및 속성)
클래스 파일의 마지막 항목은 속성의 개수와 attribute_info 목록입니다. Atribute_info 테이블은 속성 이름을 저장하는 상수 풀에 Constant_utf8_info를 가리키는 일부 인덱스를 저장합니다. Java Virtual Machine 사양에는 소스 코드와 내부 클래스라는 두 가지 유형의 속성이 정의되어 있습니다.
위 내용은 Java 소개입니다. Java 클래스 파일에 대한 자세한 설명은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!