Pagina Iniziale | Preferiti Comunity: Login | Registrati | Newsletter | Forum | Concorsi Newsgroup
Canali: Hardware | Software | Files | Webmaster | Cellulari | Shop
Nel sito: News | Articoli | Files | Manuali | Consigli PC | Schede cellulari | Programmaz. | Hosting | Motori Ricerca | Glossario | Link
Servizi: Shopping | Forum | Crea un BLOG | Cartucce Compatibili | Tool News |   Sponsor: Automazione Industriale
  Articoli

Recensioni
Consigli per PC


  News e files

Software
Telefonia
Internet
Tecnologia
Files e Download


  Manualistica

Guide HW/SW
Scripts ASP
Scripts HTML
Scripts Java
Scripts Delphi
Glossario


  Shopping

Hardware
Software e Giochi
Elettronica
Cinema e Film
Console e Accessori
Prodotti Ufficio
Formazione e Corsi

Tieniti aggiornato sul mondo della tecnologia con la nostra newsletter!
La tecnologia sulla tua
casella e-mail

[Info Newsletter]


Concessionaria Pubblicitaria

<< News Precedente [Fine Pagina] News Successiva >>
Identificazione del tipo a run-time

Un articolo di: Staff del 28/02/2002      Letture: 15068

Identificazione del tipo a run-time.

di Luciano Serino

Può essere utile, in fase di esecuzione (run-time) conoscere il tipo di un oggetto. Si pensi ad esempio alla gestione di più oggetti memorizzati in una Collection "archivio" contenente i seguenti tipi:

Foto ( legato ad un file di immagine);
Audio ( legato ad un file audio);
Documento ( legato ad un file di testo);
Memo ( Una Stringa legata ad una data );

Sarebbe possibile effettuare un'interrogazione per poter identificare ciascun tipo ospitato nella collection e quindi richiamare gli opportuni metodi relativi al tipo identificato.
Ricordando inoltre che laddove si utilizzi un oggetto di tipo Collection si devono ridefinire i metodi hashcode ed equals, quest'ultimo metodo potrebbe essere implementato basandosi sulla conoscenza del tipo degli oggetti da confrontare (si veda l'articolo "Collection: ridefinizione dei metodi equals e hashcode" ).

Mentre un'applicazione è in esecuzione, il sistema run-time di java identifica il tipo di ciascun oggetto in esecuzione registrandone la classe di appartenenza. Questo processo si chiama appunto identificazione del tipo a run-time. Tuttavia esiste una classe appartenente all' API java.lang, che permette di accedere a questa informazione a livello di compilazione, ossia la rende gestibile dal programmatore. La classe in questione si chiama java.lang.Class. Si può dire quindi che un oggetto Class è la rappresentazione di un qualsiasi Tipo (Classe) Java. Ogni oggetto Java eredita dalla classe java.lang.Object il metodo getClass( ),che restituisce, appunto, un' istanza di tipo Class .

GenericoOggetto g; Class cl = g.getClass();

Un'altro metodo per ottenere un oggetto di tipo class è il seguente:

Class c = MioTipo.class; Class c2 = int.class;

che ancora vale per qualsiasi tipo Java. Abbiamo così a disposizione un metodo per "registrare" un qualsiasi Tipo in un oggetto Class. Vediamo adesso quali utili informazioni Class è capace di fornire.

Class dispone del metodo getName(), capace di restituire una stringa contenente il nome della classe registrata e quindi utilizzabile dal programmatore. Ad esempio:

System.out.println( g.getClass().getName() )

stampa:

GenericoOggetto

Si ha quindi la possibilità di realizzare programmi capaci di adattarsi a run-time così come previsto dal programmatore, in quanto un oggetto Class garantisce al programmatore un riferimento concreto intorno al quale modellare il flusso di controllo di un processo. Ad esempio, per la gestione della collection Agenda si potrebbe utilizzare getName() come segue:

String nomeClasse; ... public void inserisci(Object obj){ nomeClasse = obj.getClass().getName(); if ( nomeClasse.equals("Foto")) { … gestisciFoto(obj); … } else If( nomeClasse.equals("Audio")) { …; gestisciAudio(obj); … } else If( nomeClasse.equals("Documento")) { …; gestisciDocumento(obj); …; } else { rifiutaTipo( nomeClasse ); } }; ...

Un altro metodo fornito da Class è forName( String className )

E' un metodo statico che restituisce un oggetto Class contenente il tipo identificato dalla stringa className.Vediamone un esempio:

String className = "Foto"; Class cl = Class.forName( className );

Ovviamente, nel caso in cui la classe non esistesse si genererebbe un'eccezione, quindi il tutto deve essere racchiuso in un blocco try-catch come segue :

try{ String className = "Foto"; Class cl = Class.forName( className ); }catch(ClassNotFoundException cnfe){ …; }

Dopo questo primo approccio possiamo passare ad una descrizione più sistematica delle problematiche:

? Object getNewInstance(); Restituisce un'istanza del Tipo registrato nell'oggetto Class. Questo metodo funziona solo se il costruttore della classe da istanziare non prevede argomenti. Nel caso in cui vi siano parametri da specificare si deve utilizzare il metodo newInstance(Object[] parametri) della classe java.lang.reflect.Construct ( si veda l'articolo dedicato alla Riflessione ). Tale metodo lancia le seguenti eccezioni di tipo checked (ossia da catturare necessariamente ): 1. IllegalAccessException; 2. InstantiationException;

? static Class forName( String nomeClasse ); Restituisce un oggetto Class contenente il Tipo specificato da nomeClasse. E' bene ricordare che nomeClasse deve contenere il percorso completo del Tipo rispetto al package di appartenenza ( es: "java.lang.String" e non "String" ) Tale metodo lancia la seguente eccezione di tipo checked: 1. ClassNotFoundException;

Questi due metodi si possono usare come segue:

try{ cl = Class.forName(nomeClasse); Object obj = cl.newInstance(); ...; }catch(ClassNotFoundException cnfe){ ...; }catch(IllegalAccessException iae){ ...; }catch(InstantiationException ie){ ...; }

? String toString(); Restituisce il nome della classe o dell'interfaccia. Se si tratta di una classe, la parola "class" precede il nome della classe, altrimenti "interface" se si tratta di un'interfaccia.

? Class[ ] getInterface(); Ritorna un array di oggetti Class contenenti tutte le interfacce implementate dal Tipo registrato nell'oggetto class.



Un esempio completo.

E' Costituito dal package lezioni contenente due classi: 1. Classe RunTimeClass; 2. Classe Tester;

La classe RunTimeClass possiede 2 costruttori:

RunTimeClass(Object obj) Visualizza il nome del Tipo di qualsiasi oggetto passatogli nel costruttore

La Classe Tester gestisce RunTimeClass creando più istanze di essa

RunTimeClass(String nomeClasse) Crea un'istanza e ne visualizza il nome mediante Class.getName() e Object.toString.

Classe RunTimeClass. package lezioni;

public class RunTimeClass {
Class cl;
String nomeTipo;

//Visualizza il nome del tipo di qualsiasi oggetto
public RunTimeClass(Object obj) {
cl = obj.getClass();
nomeTipo = cl.getName();
System.out.println( "\ta. Metodo Class.GetName(): " + nomeTipo );
System.out.println( "\tb. Metodo Class.toString(): " + cl );
System.out.println( "\tc. Metodo toString() dell'oggetto : " + obj );
}
/*Crea un'istanza e ne visualizza il nome mediante
Class.getName() e Object.toString */
public RunTimeClass(String nomeClasse) {
try{
cl = Class.forName(nomeClasse);
Object obj = cl.newInstance();
System.out.println(
"\t1. Nuova istanza di: " +
obj.getClass().getName()
);
System.out.println( "\t2. Metodo Class.toString(): " + cl );
System.out.println( "\t3. Nuova istanza --> toString(): " + obj );
}catch(ClassNotFoundException cnfe){
System.out.println( "\tClasse sconosciuta" );
}catch(IllegalAccessException iae){
System.out.println( "\tAccesso illegale" );
}catch(InstantiationException ie){
System.out.println( "\tErrore Istanza\n" );
}
}
}


Classe Tester. package lezioni;

public class Tester {
public String toString(){
return "Sono un oggetto Tester " ;
}

public static void main(String[] args) {
System.out.println( "\nIstanza rtc1{" );
RunTimeClass rtc1 = new RunTimeClass("java.lang.String");

System.out.println( "}\nIstanza rtc2{" );
RunTimeClass rtc2 = new RunTimeClass(new Integer(3));

System.out.println( "}\nIstanza rtc3:{" );
RunTimeClass rtc3 = new RunTimeClass("lezioni.Tester");
}
}

Visualizzera':

Istanza rc1{ 1. Nuova istanza di: java.lang.String
2. Metodo Class.toString(): class java.lang.String
3. Nuova istanza --> toString():
}
Istanza rc2{
a. Metodo Class.GetName(): java.lang.Integer
b. Metodo Class.toString(): class java.lang.Integer
c. Metodo toString() dell'oggetto : 3
} Istanza rc3:{
1. Nuova istanza di: lezioni.Tester
2. Metodo Class.toString(): class lezioni.Tester
3. Nuova istanza --> toString(): Sono un oggetto Tester


Class, inoltre, presenta dei metodi particolari che restituiscono oggetti di tipo Field,Method,Constructor. Queste Classi si comportano similmente a Class ma, come il loro nome lascia intuire, si applicano non per gestire il Tipo di un oggetto, bensì, rispettivamente, i suoi campi, metodi e costruttori ( si veda l'articolo articolo sulla Riflessione) .Riassumiamo quindi ed ampliamo le classi ed i metodi citati in questo articolo:
API:           java.lang.Object
? Class          getClass();
API:          java.lang.Class
? static Class      forName( String className )
? public String      getName();
? public String      toString();
? public Class       getSuperClass();
? public Class[]      getInterfaces();
? public boolean      isInterfaces();
? public Object      newInstance();
? public Field[]      getFields();

Restituisce un array di oggetti java.reflect.Field per la gestione a run-time dei Campi pubblici del Tipo rappresentato da un'oggetto Class.

? public Method[] getMethods();

Restituisce un array di oggetti java.reflect.Method per la gestione a run-time dei metodi pubblici del Tipo rappresentato da un'oggetto Class.

? public Constructor[] getConstructors();
Restituisce un array di oggetti java.reflect.Constructor per la gestione a run-time dei costruttori pubblici Tipo rappresentato da un'oggetto Class.

? public Field[] getDeclaredField();
Restituisce un array di oggetti java.reflect.Field per la gestione a run-time di tutti i Campi, pubblici, privati, ereditati etc del Tipo rappresentato da un'oggetto Class.

? public Method[] getDeclaredMethods();
Restituisce un array di oggetti java.reflect.Method per la gestione a run-time di tutti i Metodi, pubblici, privati, ereditati etc, del Tipo rappresentato da un'oggetto Class .

? public Constructor[] getDeclaredConstructors();
Restituisce un array di oggetti java.reflect. Constructor per la gestione a run-time di tutti i Costruttori del Tipo rappresentato da un'oggetto Class.

API: java.lang.reflect.Constructor

? Object newInstance( Object[] args )
Restituisce un'istanza della classe rappresentato da un'oggetto Class utilizzando il costruttore non di default della classe da istanziare. Object[] args contiene tutti i parametri da passare al costruttore da utilizzare.



[Indietro]    [Su]      [Home]      [Commenti]      [V. Stampabile]

Commento di Anonimo (ip: 83.181.243.148), scritto il 20/08/2006 alle 15:28:47
Grande !
by 'grep man'

Commenta questa notizia:
Non hai ancora fatto il
Login, puoi inserire commenti solo come anonimo.
ATTENZIONE: il tuo IP verrà memorizzato e mostrato a fianco del commento; con la pressione del tasto invia commento si esprime il consenso alla pubblicazione di tale informazione personale.
A discrezione dello staff, i commenti ritenuti non adatti od offensivi potranno essere rimossi. Nel caso di utilizzo di espressioni volgari od offensive il comportamento verrà segnalato al provider interessato.
Se non ti sei ancora registrato, cosa aspetti? Registrati subito.

Da ora puoi discutere dei problemi informatici anche sul nostro FORUM

Testo del commento:


  News correlate
 Corso Java @ilsoftware.it
 Il linguaggio Java: lez.10/10
 Il linguaggio Java: lez.9
 Il linguaggio Java: lez.8
 Il linguaggio Java: lez.7
 Il linguaggio Java: lez.6
 Il linguaggio Java: lez.5
 Il linguaggio Java: lez.4
  Ultime dal Forum

?????????????? ???????? ? ???????
???????????? – ?????? ???????? ?????????????
????? ??? ???????? ??????? ???????
writing service chicago
essay on mr know all
thesis on civil war
essay on what a true friend is
in literature proposal review sample thesis
did slavery cause the civil war essay

Comunicazioni / Note Legali / Staff / Collabora / Pubblicità / Privacy / Contatti


Triboo Media s.r.l. (società socio unico) - Viale Sarca 336 - Edificio 16, 20126 Milano (MI) Cap. Soc. 1.250.000,00 euro i.v. - P.IVA, C.F. e CCIAA di Milano IT06933670967 - REA MI-1924178 tel. +39 02 64741470 - fax +39 02 64741494 Società sottoposta alla direzione e coordinamento di TRIBOO SPA - all rights reserved CAP. SOC. EURO 28.740.210 I.V. - P.IVA 02387250307 - COD. FISC. e numero iscrizione al registro delle imprese CCIAA MI : 02387250307 tel.+39 02 64741401 - fax + 39 02 64741491. Utenti Connessi: 262


Pagina creata in 0,16sec. Powered by JuiceADV S.r.l.

Stats v0.1 (0,000sec.)