Vad är en klassfil?
En Klassfil i Java är den kompilerade utdata från klassen .java som faktiskt exekveras av en Java Virtual Machine (JVM). Klassfiler kan köras individuellt och kan vara en del av en JAR-fil som en bunt tillsammans med andra paketfiler. Dessa kan skapas med kommandot javac
från kommandoradsgränssnittet. Vissa Java IDEs som Eclipse och NetBeans tillhandahåller skapa .class-utdatafiler från projektets Java filer.
Klass filformat
En Java-klassfil består av bytekod som är en mellankod som ska köras av JVM. En klassfil består av en ström av 8-bitars byte och multibyte dataobjekt lagras alltid i big-endian ordning.
Klassfilstruktur
Klassfilstrukturen är som visas nedan.
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];
}
var:
- u1 = unsigned one-byte kvantitet
- u2 = osignerad två-byte kvantitet
- u4 = osignerad fyra-byte kvantitet
Detaljer om .class-filstrukturen förklaras också i Oracle klassfilformat och kan refereras av utvecklare som referens. En sammanfattning av dessa fält är följande.
magic
- Det magiska objektet tillhandahåller det magiska numret som identifierar klassens filformat; den har värdet 0xCAFEBABE.minor_version
,major_version
- Värdena för minor_version- och major_version-objekten är minor- och major-versionsnumren för denna klassfil.constant_pool_count
- Värdet på constant_pool_count-objektet är lika med antalet poster i constant_pool-tabellen plus en. Ett constant_pool-index anses giltigt om det är större än noll och mindre än constant_pool_count, med undantag för konstanter av typen long och double.constant_pool[]
- konstant_poolen är en tabell med strukturer (§4.4) som representerar olika strängkonstanter, klass- och gränssnittsnamn, fältnamn och andra konstanter som refereras till inom ClassFile-strukturen och dess understrukturer. Formatet för varje konstant_pool-tabellpost indikeras av dess första “tagg”-byte.access_flags
- Värdet på access_flags-objektet är en mask av flaggor som används för att ange åtkomstbehörigheter till och egenskaper för denna klass eller gränssnitt.this_class
- Värdet för this_class-objektet måste vara ett giltigt index i constant_pool-tabellen.super_class
- För en klass måste värdet på super_class-objektet antingen vara noll eller måste vara ett giltigt index i constant_pool-tabellen.interfaces_count
- Värdet för objektet interfaces_count anger antalet direkta supergränssnitt av denna klass eller gränssnittstyp.interfaces[]
- Varje värde i interfaces-arrayen måste vara ett giltigt index i tabellen constant_pool.fields_count
- Värdet på fields_count-objektet anger antalet field_info-strukturer i fälttabellen.fields[]
- Varje värde i fälttabellen måste vara en field_info-struktur som ger en fullständig beskrivning av ett fält i denna klass eller gränssnitt.methods_count
- Värdet på methods_count-objektet anger antalet metodinfo-strukturer i metodtabellen.methods[]
- Varje värde i metodtabellen måste vara en method_info-struktur som ger en fullständig beskrivning av en metod i denna klass eller gränssnitt. Om ingen av flaggorna ACC_NATIVE och ACC_ABSTRACT är inställda i access_flags-objektet i en metod_info-struktur, tillhandahålls Java Virtual Machine-instruktionerna som implementerar metoden också.attributes_count
- Värdet på attributes_count-objektet anger antalet attribut (§4.7) i attributtabellen för denna klass.attribut[]
– Varje värde i attributtabellen måste vara en attribute_info-struktur.