Mi az a Class fájl?
A Java nyelvű osztályfájl a .java osztály lefordított kimenete, amelyet valójában egy Java Virtual Machine (JVM) hajt végre. Az osztályfájlok külön-külön is végrehajthatók, valamint részei lehetnek egy JAR fájlnak csomagként, más csomagfájlokkal együtt. Ezeket a javac
paranccsal lehet létrehozni a parancssori felületről. Egyes Java IDE-k, például az Eclipse és a NetBeans .class kimeneti fájlokat biztosítanak a projekt Java-jából. fájlokat.
Osztály fájlformátum
A Java osztályfájl bájtkódból áll, amely a JVM által futtatandó köztes kód. Az osztályfájl 8 bites bájtokból áll, és a többbájtos adatelemek mindig nagy sorrendben tárolódnak.
ClassFile szerkezet
Az osztályfájl szerkezete az alábbiak szerint látható.
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];
}
ahol:
- u1 = előjel nélküli egybájtos mennyiség
- u2 = előjel nélküli kétbájtos mennyiség
- u4 = előjel nélküli négybájtos mennyiség
A .class fájlszerkezet részleteit, valamint az Oracle [osztályfájlformátum]-ban (https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html) ismertetett részleteket, és hivatkozhat rájuk fejlesztők referenciaként. Ezeknek a mezőknek az összefoglalása a következő.
magic
– A mágikus elem megadja az osztály fájlformátumát azonosító mágikus számot; ennek értéke 0xCAFEBABE.minor_version
,major_version
- A minor_version és major_version elemek értékei ennek az osztályfájlnak a kisebb és fő verziószámai.constant_pool_count
- A konstans_pool_számláló elem értéke megegyezik a konstans_pool_számláló táblában lévő bejegyzések számával plusz eggyel. A konstans_készlet index akkor tekinthető érvényesnek, ha nagyobb, mint nulla, és kisebb, mint a konstans_készlet_száma, kivéve a long és double típusú konstansokat.constant_pool[]
- A konstans_készlet egy struktúrák táblázata (4.4. §), amely különféle karakterlánc-konstansokat, osztály- és interfészneveket, mezőneveket és egyéb állandókat jelent, amelyekre a ClassFile struktúrában és annak alstruktúráiban hivatkoznak. Minden konstans_pool táblabejegyzés formátumát az első “tag” bájt jelzi.access_flags
– Az access_flags elem értéke az osztály vagy interfész hozzáférési engedélyeinek és tulajdonságainak jelölésére használt jelzők maszkja.this_class
- A this_class elem értékének érvényes indexnek kell lennie a konstans_pool táblában.super_class
- Osztály esetén a szuper_osztály elem értékének nullának kell lennie, vagy a konstans_pool tábla érvényes indexének kell lennie.interfaces_count
- Az interfaces_count elem értéke megadja az ehhez az osztályhoz vagy interfésztípushoz tartozó közvetlen szuperinterfészek számát.interfaces[]
- Az interfészek tömb minden értékének érvényes indexnek kell lennie a konstans_pool táblában.fields_count
- A fields_count elem értéke megadja a field_info struktúrák számát a mezőtáblázatban.fields[]
- A mezők táblájában minden értéknek egy field_info struktúrának kell lennie, amely teljes leírást ad egy mezőnek ebben az osztályban vagy interfészben.methods_count
- A Methods_count elem értéke megadja a method_info struktúrák számát a metódustáblában.methods[]
- A metódustáblában szereplő minden értéknek egy method_info struktúrának kell lennie, amely teljes leírást ad az ebben az osztályban vagy interfészben található metódusokról. Ha az ACC_NATIVE és az ACC_ABSTRACT jelzők egyike sincs beállítva egy method_info struktúra access_flags elemében, akkor a módszert megvalósító Java Virtual Machine utasítások is rendelkezésre állnak.attributes_count
- Az attribútumok_száma elem értéke megadja az attribútumok számát (§4.7) az osztály attribútumtáblázatában.attributes[]
– Az attribútumtáblázat minden értékének attribútum_info struktúrának kell lennie.