La classe Class – Lezione 4 di Java Avanzato

La riflessione di un oggetto con la classe Class di Java

In Java viene messa a disposizione un tipo particolare di classe, si tratta di Class. Questa classe consente di tenere traccia alla JVM durante l’esecuzione di un’applicazione di tutte le classi caricate in memoria. Può essere vista come il corrispondente di Object per le classi, se Object serve per “gestire” gli oggetti di un’applicazione, la classe Class serve a modellare le classi. Quando un programma ha la capacità di eseguire operazioni che hanno oggetto se stesso, ed in particolare del suo codice sorgente, si parla di riflessione o in inglese reflection.

Un’istanza di una classe Class rappresenta una classe o un’interfaccia in un’applicazione Java a runtime. Anche gli array appartengono ad una classe che viene riflessa come un oggetto Class e condiviso da tutti gli array con lo stessa dimensione e tipo di elementi. Pure i tipi primitivi (boolean, byte, char, short, int, long, float, e double) e la parala chiave void sono rappresentati come oggetti Class.

L’intestazione di Class è la seguente:

  public final class Class
  extends Object
  implements Serializable

Un oggetto di tipo Class contiene tutte le informazioni relative alla classe caricata. Ad esempio conterrà la lista delle sue superclassi, delle sue sottoclassi, delle interfacce implementate, i nomi dei metodi, ecc.

Come creare un oggetto di tipo Class

Class non ha un costruttore pubblico. Le istanze di questa classe possono essere create solo dalla Java Virtual Machine ed esistono solo tre modi per raggiungerla:

  1. Tramite Object che mette a disposizione:

      public final Class getClass()

    Il metodo getClass restituisce al chiamante un oggetto di tipo Class contenente le informazioni sulla classe di appartenenza dell’oggetto su cui è stato invocato. Ad esempio, se abbiamo un oggetto x di tipo A, un’invocazione a x.getClass() restituirà un oggetto di tipo A contente le sue superclassi, le sottoclassi, ecc.
    Siccome questo metodo è contenuto in Object verrà ereditato da qualsiasi classe, l’oggetto restituito sarà unico per ogni classe.

  2. Con l’operatore .class, in questo caso verrà restituito l’oggetto Class corrispondete alla classe a cui viene applicato. Quest’operatore unario postfisso con un unico argomento è applicabile solo alle classi. Ad esempio:
      String.class

    Restituisce un oggetto Class corrispondente a quella classe.

  3. Tramite Class che contiene il metodo:
      public static Class forName(String name) throws ClassNotFoundException

    Il metodo forName restituisce l’oggetto Class associato alla classe o interfaccia corrisponde alla stringa data in ingresso. Ovvero, questo metodo viene utilizzato per cercare la classe con lo stesso nome dato in ingresso.
    Il nome della classe deve essere completo (fully qualified), a meno che non si trovi nel package di default.

Come ottenere oggetti di tipo Class

Se siamo interessati a conoscere il nome della classe di un oggetto è possibile invocare sull’oggetto Class il metodo getName:

  public String getName()

Questo metodo restituisce il nome della classe rappresentata dall’oggetto. Il nome restituito include anche il percorso di package dell’oggetto della classe a cui è applicato:

  String.class.getName(); // Ritorna "java.lang.String"
  byte.class.getName(); // Ritorna "byte"

Oppure se si vuole stampare il nome della classe di un oggetto creato da noi stessi avremo:

  void printClassName(Object obj) {
    System.out.println("La classe di " + obj +
      " e' " + obj.getClass().getName());
  }

Il metodo newInstance permette di creare una nuova istanza della classe rappresentata dall’oggetto Class, senza sapere a tempo di compilazione di che tipo si tratta.

  public Object newInstance()

Se x è un oggetto della classe A, la chiamata:

  x.getClass().newIstance()

ritorna il riferimento a un nuovo oggetto A. Per far ciò chiama il costruttore predefinito della classe del parametro implicito (quindi di x).
Se newInstance non riesce a creare l’istanza lancia una o più eccezioni, ad esempio viene lanciata SecurityException se non ottiene l’accesso alla classe.

Se siamo interessati a conoscere le superclassi di un oggetto possiamo invocare il metodo getSuperclass(). Con getFields(), getMethods() e getConstructors() riceveremo un array con i campi dell’istanza, con i metodi pubblici e con i costruttori previsti dalla classe. Gli array ritornati sono di tipo Field per i metodi, di tipo Method per i metodi e di tipo Constructor per i costruttori. Queste classi sono vengono usate dal package java.lang.reflect per modellare i campi, i metodi e i costruttori di una classe.

Scoprire che la classe Class è paramentrica alla lezione 23. La lista completa dei metodi di Class si trova nella guida in linea ufficiale.

Indice Lezione PrecedenteLezione Successiva

Pubblicato in Guide, Java, Programmazione Taggato con: , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*