Java Reflection è abbastanza potente e può essere molto utile. Java Reflection consente di ispezionare classi, interfacce, campi e metodi in fase di esecuzione, senza conoscere i nomi delle classi, dei metodi ecc. In fase di compilazione. È anche possibile creare un'istanza di nuovi oggetti, invocare metodi e ottenere / impostare valori di campo mediante la riflessione.
Un rapido esempio di Java Reflection per mostrarti come appare l'utilizzo di reflection:
Method[] methods = MyObject.class.getMethods();
for(Method method : methods){
System.out.println("method = " + method.getName());
}
Questo esempio ottiene l'oggetto Class dalla classe denominata MyObject. Utilizzando l'oggetto class l'esempio ottiene un elenco dei metodi in quella classe, itera i metodi e stampa i loro nomi.
Il modo esatto in cui funziona tutto questo è spiegato qui
Modifica : dopo quasi 1 anno sto modificando questa risposta, mentre leggendo la riflessione ho avuto qualche altro utilizzo di Reflection.
- Spring utilizza una configurazione bean come:
<bean id="someID" class="com.example.Foo">
<property name="someField" value="someValue" />
</bean>
Quando il contesto Spring elabora questo elemento <bean>, utilizzerà Class.forName (String) con l'argomento "com.example.Foo" per creare un'istanza di quella classe.
Quindi utilizzerà nuovamente la riflessione per ottenere il setter appropriato per l'elemento <proprietà> e impostarne il valore sul valore specificato.
- Junit utilizza Reflection soprattutto per testare metodi privati / protetti.
Per i metodi privati,
Method method = targetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);
Per campi privati,
Field field = targetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);