Back   Top 

Il formato del file .class

Il formato .class è lo standard usato dalla comunità di Java per fornire codice che sia interpretabile dalla Java Virtual Machine. Tale formato comprende tutto ciò che la Java Virtual Machine deve sapere di una certa classe o interfaccia per poterla usare. Esso è progettato in modo tale da fornire le necessarie informazioni in maniera compatta e indipendente dal sistema.

L'insieme di informazioni che esso contiene è adatto anche per descrivere le classi e le interfacce per la Macchina Astratta in analisi, che si ispira molto alla Java Virtual Machine, sebbene resti più generica per molti aspetti.
Per questo motivo si propone brevemente il complesso di dati che il formato .class fornisce. Nell'ordine le componenti presenti sono:

  • il numero magico;
  • i numeri di versione;
  • la Costant Pool;
  • gli Access Flag;
  • la classe definita dal file;
  • la sua superclasse;
  • le interfacce implementate;
  • i campi dichiarati;
  • i metodi dichiarati;
  • degli attributi della classe.
Tutte le sezioni hanno lunghezza variabile, per cui tale formato può essere letto solo in maniera strettamente sequenziale.
Si osservi per inciso che uno degli obiettivi del Class Loader è infatti quello di riorganizzare tali informazioni all'interno della Class Structure in modo da consentirvi Random Access.

Il numero magico è semplicemente una sequenza di 32 bits con cui deve iniziare ogni file in tale formato, per minimizzare la probabilità di scambiare un generico flusso di byte per un file .class. Per inciso, tale numero in esadecimale è 0xCAFEBABE ( ricorda qualcosa?! ).

La Costant Pool memorizza costanti associate alla classe o interfaccia in questione. Tipiche costanti qui presenti sono stringhe, valori di field dichiarati costanti, nomi di classi, nomi di campi con il loro tipo e nomi di metodi con la loro signature ( cioé con la specifica del tipo risultato e degli argomenti attesi ).

Gli Access Flag indicano se questo file .class sta definendo una classe o un'interfaccia, se questa è public o private, abstract o final, etc ... .

Il nome della classe che si sta definendo è fornito tramite un indice alla Costant Pool, dove sarà presente sotto forma di stringa.

La superclasse è anch'essa specificata tramite un indice nella Costant Pool. Nel caso delle interfacce, il padre è comunque defito, ed è Object.

L'array delle interfacce fornisce un insieme di indici alla Costant Pool le cui entries saranno i nomi delle interfacce implementate.

La componente dei field contiene una entry per ogni field definito in questa classe. Ciascuna di queste entries contiene il nome, il tipo e i flag di accesso al field.
È da notare che parte delle informazioni è contenuta nella Costant Pool, e riferita da questa struttura tramite indicizzazione.

La componente per i metodi contiene, per ogni metodo definito in questa classe, la signature del metodo, il numero di variabili locali, la dimensione dello stack degli operandi necessaria per l'esecuzione dei suoi bytecode e i bytecode stessi.
Si osservi che questi bytecode faranno riferimento alle altre classi ed a eventuali costanti in maniera simbolica, tramite indicizzazione nella Costant Pool.

La componente degli attributi contiene altre informazioni, utili per il debug o semplicemente per eventuale documentazione della classe.

 Back   Top