Co je soubor třídy?
Soubor Class v Javě je zkompilovaný výstup třídy .java, který je ve skutečnosti spuštěn Java Virtual Machine (JVM). Soubory třídy mohou být spouštěny jednotlivě, stejně jako mohou být součástí souboru JAR jako balík spolu s dalšími soubory balíčků. Ty lze vytvořit pomocí příkazu javac
z rozhraní příkazového řádku. Některá prostředí Java IDE, jako je Eclipse a NetBeans umožňují vytvářet výstupní soubory .class z jazyka Java projektu. soubory.
Formát souboru třídy
Soubor třídy Java se skládá z bajtkódu, což je přechodný kód, který má spouštět JVM. Soubor třídy se skládá z proudu 8bitových bajtů a vícebajtové datové položky jsou vždy uloženy v pořadí big-endian.
Struktura ClassFile
Struktura souboru třídy je uvedena níže.
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
kde:
- u1 = jednobajtové množství bez znaménka
- u2 = dvoubajtové množství bez znaménka
- u4 = čtyřbajtové množství bez znaménka
Podrobnosti o struktuře souboru .class jsou také dobře vysvětleny v Oracle formát souboru třídy a lze na ně odkazovat vývojáři pro referenci. Shrnutí těchto polí je následující.
magic
- Kouzelná položka poskytuje magické číslo identifikující formát souboru třídy; má hodnotu 0xCAFEBABE.minor_version
,major_version
- Hodnoty položek minor_version a major_version jsou čísla vedlejší a hlavní verze tohoto souboru třídy.constant_pool_count
- Hodnota položky Constant_pool_count se rovná počtu záznamů v tabulce konstantních zdrojů plus jedna. Index konstantní_skupiny se považuje za platný, pokud je větší než nula a menší než počet_konstant, s výjimkou konstant typu long a double.constant_pool[]
- fond konstant je tabulka struktur (§4.4) představující různé řetězcové konstanty, názvy tříd a rozhraní, názvy polí a další konstanty, na které se odkazuje ve struktuře ClassFile a jejích podstrukturách. Formát každého záznamu tabulky konstantního fondu je indikován jeho prvním “tag” bajtem.access_flags
- Hodnota položky access_flags je maska příznaků používaných k označení přístupových oprávnění a vlastností této třídy nebo rozhraní.this_class
- Hodnota položky this_class musí být platným indexem v tabulce konstantních_podílů.super_class
– U třídy musí být hodnota položky super_class buď nula, nebo musí být platným indexem do tabulky konstantních_podílů.interfaces_count
- Hodnota položky interfaces_count udává počet přímých super rozhraní této třídy nebo typu rozhraní.rozhraní[]
- Každá hodnota v poli interfaces musí být platným indexem v tabulce konstantní_pool.fields_count
- Hodnota položky Fields_count udává počet struktur field_info v tabulce polí.fields[]
- Každá hodnota v tabulce polí musí být strukturou field_info poskytující úplný popis pole v této třídě nebo rozhraní.methods_count
- Hodnota položky methods_count udává počet struktur method_info v tabulce metod.methods[]
- Každá hodnota v tabulce metod musí být strukturou method_info poskytující úplný popis metody v této třídě nebo rozhraní. Pokud není nastaven žádný z příznaků ACC_NATIVE a ACC_ABSTRACT v položce access_flags struktury method_info, jsou dodány také instrukce Java Virtual Machine implementující metodu.attributes_count
- Hodnota položky attribute_count udává počet atributů (§4.7) v tabulce atributů této třídy.attributes[]
- Každá hodnota tabulky atributů musí být strukturou atribut_info.