Aufbau der CLASS-Datei


[ Seminar "Java und Werkzeuge für das Web" ] ... [ Inhaltsverzeichnis ] ... [ zurück ] ... [ weiter ] ... [ Literaturverzeichnis ]

Übersicht: CLASS-Datei


Überblick

Das Java-Classfile-Format besteht aus folgenden Komponenten, in der angegebenen Reihenfolge:

Konstantenpool

Der Konstantenpool beinhaltet sämtliche Konstanten einer Klasse sowie symbolische Referenzen auf alle verwendeten Klassen, Methoden und Felder. Er besitzt folgende Arten von Inhalten:
CONSTANT_Utf8Ein UTF8-codierter Unicode-String
CONSTANT_IntegerEin int-Wert
CONSTANT_FloatEin float-Wert
CONSTANT_LongEin long-Wert
CONSTANT_DoubleEin double-Wert
CONSTANT_ClassEine Referenz auf einen CONSTANT_Utf8-Eintrag, der einen voll qualifizierten Klassen- oder Schnittstellennamen enthält
CONSTANT_StringEine Referenz auf einen CONSTANT_Utf8-Eintrag, der eine Stringkonstante enthält
CONSTANT_NameAndTypeZwei Referenzen auf CONSTANT_Utf8-Einträge, von denen der erste einen Namen und der zweite einen Typ enthält
CONSTANT_FieldrefEine Referenz auf einen CONSTANT_Class-Eintrag, sowie eine auf einen CONSTANT_NameAndType-Eintrag, der Name und Typ eines Feldes der referenzierten Klasse enthält
CONSTANT_MethodrefEine Referenz auf einen CONSTANT_Class-Eintrag, sowie eine auf einen CONSTANT_NameAndType-Eintrag, der Name und Typ (Rückgabewert plus Parameter) einer Methode der referenzierten Klasse enthält
CONSTANT_InterfaceMethodrefEine Referenz auf einen CONSTANT_Class-Eintrag, sowie eine auf einen CONSTANT_NameAndType-Eintrag, der Name und Typ (Rückgabewert plus Parameter) einer Methode der referenzierten Schnittstelle enthält

Feld- und Methodeninformationen

An dieser Stelle stehen in der Datei für jedes Feld und jede Methode jeweils folgende Informationen:

Attribute

Attribute können sowohl bei Klassen als auch bei Feldern und Methoden sowie als Unterbestandteil des Attributs 'Code' (siehe unten) vorkommen. Jede Art von Attribut ist durch ihren Namen eindeutig definiert und kann einen beliebigen Inhalt haben.
Programmierer von Java-Compilern können beliebige eigene Attribute einführen, müssen sich dafür aber bei der Namensgebung an Suns "Reverse Domain Name"-Notation halten (Beispiel: de.fh-wedel.beispielattribut). Dabei darf die Ausführung des Programms nicht von diesem Programm abhängig sein - das heißt, auf einer VM, die dieses Attribut nicht kennt (trifft eine VM auf ein ihr unbekanntes Attribut, muss sie es ignorieren), muss das Programm trotzdem genau das tun, was von ihm erwartet wird.
Ein Beispiel für ein solches Attribut wäre z.B. eines, welches die Version des Compilers enthält, mit dem es compiliert wurde.

Attribute, die von allen VMs erkannt werden müssen, sind folgende:

Code
Dieses Attribut muss in jeder nichtabstrakten Methode vorhanden sein. Es beinhaltet für jede dieser Methoden folgende Informationen: Eine Exception-Tabelle beinhaltet sämtliche Informationen für Exception-Behandlungen einer Methode. Jede Zeile einer Exception-Tabelle enthält folgende Informationen:
ConstantValue
Dieses Attribut ist nur für statische Felder gültig. Wird ein Feld mit einem konstanten Wert definiert, so schreibt der Compiler den Wert dieses Feldes in dieses Attribut.
Exceptions
Das Attribut "Exceptions" enthält eine Liste aller Exceptions, die eine Methode nach außen hin werfen kann in Form von Referenzen auf den Konstantenpool.
InnerClasses
Das Attribut "InnerClasses" enthält Namen und Flags aller Klassen, die Member-Klassen der aktuellen Klasse sind.
Synthetic
Das Vorhandensein des Attributs "Synthetic", welches keine eigenen Eigenschaften hat (also die Funktion eines Flags erfüllt), zeigt, dass das Feld, die Methode oder die Klasse, bei der es steht, nicht vom Programmierer sondern vom Compiler generiert wurde.

Weitere von Sun definierte Standard-Attribute, die aber nicht zwangsläufig erkannt werden müssen, sind:

Deprecated
Das Attribut "Deprecated" hat keine Eigenschaften, es erfüllt also die Funktion eines Flags. Ein Compiler kann dieses Attribut, welches sowohl in Klassen als auch in Feldern und Methoden vorkommen kann, verwenden, um darauf hinzuweisen, dass der Programmierer ein Element der API verwendet, welches offiziell nicht mehr verwendet werden sollte.
LineNumberTable
Dieses Attribut, welches als Unterattribut von "Code" vorkommen kann, kann die VM für Fehlermeldungen verwenden - es enthält die Information, aus welcher Quellcodezeile welche Stücke des Bytecodes ursprünglich stammten.
LocalVariableTable
Dieses Attribut assoziiert lokale Variablen (welche in der Class-Datei keine Namen mehr haben, sondern nur über einen Index identifiziert werden) mit ihren ursprünglichen Namen (als UTF8-Einträge im Konstantenpool). Es ist ebenfalls dazu gedacht, aussagekräftige Fehlermeldungen zu erzeugen.
SourceFile
Das Attribut "SourceFile" identifiziert einen UFT8-Eintrag im Konstantenpool, der den Original-Dateinamen, aus dem die Klasse generiert wurde, enthält.
[ Seminar "Java und Werkzeuge für das Web" ] ... [ Inhaltsverzeichnis ] ... [ zurück ] ... [ oben ] ... [ weiter ] ... [ Literatur ]