Riflessione — è un meccanismo che consente di esplorare e modificare la struttura e il comportamento di classi, oggetti, metodi e campi durante l'esecuzione di un programma. È realizzato tramite il pacchetto java.lang.reflect.
Permette di:
Esempio:
import java.lang.reflect.Method; public class ReflectionExample { public void greet() { System.out.println("Hello!"); } public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("ReflectionExample"); Object instance = clazz.getDeclaredConstructor().newInstance(); Method method = clazz.getMethod("greet"); method.invoke(instance); // Stampa: Hello! } }
Vantaggi:
Svantaggi/rischi:
È possibile accedere ai campi e ai metodi privati di una classe tramite riflessione, e quali sono le conseguenze di ciò?
Risposta: Sì, è possibile tramite il metodo setAccessible(true) di Field o Method:
Field field = clazz.getDeclaredField("privateField"); field.setAccessible(true); field.set(obj, "value");
Questo viola l'incapsulamento della classe e comporta rischi: la situazione diventa fragile, possono sorgere errori di sicurezza, e nelle nuove versioni della JVM tali azioni possono essere limitate dalle politiche di accesso.
Storia
In un grande progetto per il mappaggio automatico di DTO tramite riflessione, i campi di tipo "Optional" non venivano gestiti correttamente, portando a NullPointerException durante l'elaborazione di massa dei dati, poiché il pacchetto di riflessione non distingueva i valori Optional e null.
Storia
In un software bancario, è stato implementato l'accesso ai campi privati tramite setAccessible(true) per la serializzazione. Dopo un aggiornamento della JVM, il comportamento è cambiato, l'accesso al campo privato è risultato bloccato, e una funzionalità importante di serializzazione ha improvvisamente smesso di funzionare in produzione.
Storia
In un framework ORM, dimenticai di aggiornare la cache della riflessione dopo aver modificato lo schema dei dati. Di conseguenza, il sistema ha generato eccezioni imprevedibili quando si lavorava con nuovi campi delle classi, che non erano riflessi nella cache.