logo

API di riflessione Java

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.
Sai?
  • 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:

MetodoDescrizione
1) stringa pubblica getName()restituisce il nome della classe
2) La classe statica pubblica forName (String className) genera ClassNotFoundExceptioncarica la classe e restituisce il riferimento della classe Class.
3) L'oggetto pubblico newInstance() genera InstantiationException, IllegalAccessExceptioncrea 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 SecurityExceptionrestituisce il numero totale di campi di questa classe.
9) Metodo pubblico[] getDeclaredMethods() genera SecurityExceptionrestituisce il numero totale di metodi di questa classe.
10) public Constructor[] getDeclaredConstructors() genera SecurityExceptionrestituisce il numero totale di costruttori di questa classe.
11) Metodo pubblico getDeclaredMethod (nome stringa, tipo parametri Classe []) genera NoSuchMethodException, SecurityExceptionrestituisce 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