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.