aspose.info
SV

Klass - Java Class File Format

Uppdaterad

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.

Referenser

Se även