La reflection in Java è una potente funzionalità che consente di ispezionare ed eventualmente modificare il comportamento di classi, metodi e campi durante l'esecuzione. È utile in vari contesti come tool di debug, framework, e librerie di serializzazione.
Importare il pacchetto reflection
La reflection è disponibile nel pacchetto java.lang.reflect
. Per utilizzarla, è necessario importare le classi appropriate:
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
Ottenere un oggetto Class
Il primo passo per usare la reflection è ottenere un oggetto Class
che rappresenti la classe da ispezionare.
Class<?> clazz = MyClass.class;
// oppure
Class<?> clazz = Class.forName("com.mypackage.MyClass");
// oppure da un'istanza
MyClass obj = new MyClass();
Class<?> clazz = obj.getClass();
Accedere ai metodi
Puoi ottenere i metodi pubblici o dichiarati nella classe, inclusi quelli privati.
for (Method method : clazz.getDeclaredMethods()) {
System.out.println("Metodo: " + method.getName());
}
Invocare un metodo
Una volta ottenuto un oggetto Method
, puoi invocarlo anche se è privato.
Method method = clazz.getDeclaredMethod("method", String.class);
method.setAccessible(true); // Necessario se il metodo è privato
Object result = method.invoke(obj, "arg");
Accedere ai campi
È possibile leggere e scrivere nei campi di un oggetto.
Field prop = clazz.getDeclaredField("prop");
prop.setAccessible(true); // Permette l'accesso a campi privati
Object value = prop.get(obj);
prop.set(obj, "newValue");
Creare un'istanza via reflection
È possibile istanziare una classe anche senza usare il costruttore direttamente.
Constructor<?> constr = clazz.getDeclaredConstructor();
constr.setAccessible(true);
Object inst = constr.newInstance();
Considerazioni sulla sicurezza
L'uso della reflection può violare l'incapsulamento e introdurre vulnerabilità di sicurezza. Inoltre, è meno efficiente rispetto al codice diretto e dovrebbe essere usata con cautela.
Conclusione
La reflection in Java è uno strumento potente e flessibile, ma deve essere utilizzata responsabilmente. È fondamentale comprenderne i rischi e i limiti, specialmente in ambienti ad alte prestazioni o sicuri.