Riflessione Java è un processo di esame o modifica del comportamento di esecuzione di una classe in fase di esecuzione .
IL java.lang.Class class fornisce molti metodi che possono essere utilizzati per ottenere metadati, esaminare e modificare il comportamento in fase di esecuzione di una classe.
I pacchetti java.lang e java.lang.reflect forniscono classi per la riflessione Java.
Dove viene utilizzato
L'API Reflection viene utilizzata principalmente in:
- IDE (ambiente di sviluppo integrato), ad esempio Eclipse, MyEclipse, NetBeans ecc.
- Debug
- Strumenti di test ecc.
- In quanti modi possiamo ottenere l'istanza della classe Class?
- Come creare lo strumento Javap?
- Come creare lo strumento appletviewer?
- Come accedere al metodo privato dall'esterno della classe?
classe java.lang.Class
La classe java.lang.Class svolge principalmente due compiti:
- fornisce metodi per ottenere i metadati di una classe in fase di esecuzione.
- fornisce metodi per esaminare e modificare il comportamento in fase di esecuzione di una classe.
Metodi comunemente usati della classe Class:
Metodo | Descrizione |
---|---|
1) stringa pubblica getName() | restituisce il nome della classe |
2) La classe statica pubblica forName (String className) genera ClassNotFoundException | carica la classe e restituisce il riferimento della classe Class. |
3) L'oggetto pubblico newInstance() genera InstantiationException, IllegalAccessException | crea una nuova istanza. |
4) booleano pubblico isInterface() | controlla se è l'interfaccia. |
5) isArray booleano pubblico (); | controlla se è un array. |
6) booleano pubblico isPrimitive() | controlla se è primitivo. |
7) Classe pubblica getSuperclass() | restituisce il riferimento alla classe della superclasse. |
8) public Field[] getDeclaredFields() genera SecurityException | restituisce il numero totale di campi di questa classe. |
9) Metodo pubblico[] getDeclaredMethods() genera SecurityException | restituisce il numero totale di metodi di questa classe. |
10) public Constructor[] getDeclaredConstructors() genera SecurityException | restituisce il numero totale di costruttori di questa classe. |
11) Metodo pubblico getDeclaredMethod (nome stringa, tipo parametri Classe []) genera NoSuchMethodException, SecurityException | restituisce l'istanza della classe del metodo. |
Come ottenere l'oggetto della classe Class?
Esistono 3 modi per ottenere l'istanza della classe Class. Sono i seguenti:
- Metodo forName() della classe Class
- metodo getClass() della classe Object
- la sintassi .class
1) Metodo forName() della classe Class
- viene utilizzato per caricare la classe in modo dinamico.
- restituisce l'istanza della classe Class.
- Dovrebbe essere utilizzato se si conosce il nome completo della classe. Non può essere utilizzato per i tipi primitivi.
Vediamo il semplice esempio del metodo forName().
bash ciclo while
Nome del file: Prova.java
class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } }
Produzione:
Simple
2) metodo getClass() della classe Object
Restituisce l'istanza della classe Class. Dovrebbe essere utilizzato se si conosce il tipo. Inoltre, può essere utilizzato con le primitive.
Nome del file: Prova.java
class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } }
Produzione:
Simple
3) La sintassi .class
Se un tipo è disponibile, ma non è presente alcuna istanza, è possibile ottenere una classe aggiungendo '.class' al nome del tipo. Può essere utilizzato anche per tipi di dati primitivi.
Nome del file: Prova.java
class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } }
Produzione:
boolean Test
Determinazione dell'oggetto della classe
I seguenti metodi della classe Class vengono utilizzati per determinare l'oggetto della classe:
1) booleano pubblico isInterface(): determina se l'oggetto Class specificato rappresenta un tipo di interfaccia.
2) isArray booleano pubblico(): determina se questo oggetto Class rappresenta una classe di array.
3) booleano pubblico isPrimitive(): determina se l'oggetto Class specificato rappresenta un tipo primitivo.
Vediamo il semplice esempio di API di riflessione per determinare il tipo di oggetto.
Nome del file: Prova.java
class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } }
Produzione:
false true
Pro e contro della riflessione
La riflessione Java dovrebbe essere sempre utilizzata con cautela. Sebbene la riflessione offra molti vantaggi, presenta anche alcuni svantaggi. Discutiamo prima dei vantaggi.
Professionisti: L'ispezione di interfacce, classi, metodi e campi durante il runtime è possibile utilizzando la riflessione, anche senza utilizzare i loro nomi durante la fase di compilazione. È anche possibile chiamare metodi, istanziare un clear o impostare il valore dei campi utilizzando la riflessione. Aiuta nella creazione di ambienti di sviluppo visivo e browser di classi che forniscono aiuto agli sviluppatori per scrivere il codice corretto.
divisione della stringa c++
Contro: Usando la riflessione, si possono infrangere i principi dell'incapsulamento. È possibile accedere ai metodi e ai campi privati di una classe utilizzando la riflessione. Pertanto, la riflessione può far trapelare dati importanti al mondo esterno, il che è pericoloso. Ad esempio, se si accede ai membri privati di una classe e si imposta un valore null, l'altro utente della stessa classe può ottenere NullReferenceException e questo comportamento non è previsto.
Un altro demerito è il sovraccarico in termini di prestazioni. Poiché i tipi in riflessione vengono risolti dinamicamente, l'ottimizzazione JVM (Java Virtual Machine) non può avvenire. Pertanto, le operazioni eseguite dalle riflessioni sono generalmente lente.
Conclusione
A causa degli svantaggi sopra menzionati, è generalmente consigliabile evitare l'uso della riflessione. È una funzionalità avanzata che dovrebbe essere utilizzata solo da programmatori o sviluppatori che abbiano una buona conoscenza delle basi del linguaggio. Ricordate sempre! Ogni volta che viene utilizzata la riflessione, la sicurezza dell'applicazione viene compromessa.
Argomenti successivi del tutorial sull'API Reflection
metodo newInstance()Comprendere lo strumento Javap
creazione dello strumento Javap
creazione dello strumento appletviewer
Chiama il metodo privato da un'altra classe