Java Reflection est assez puissant et peut être très utile. Java Reflection permet d'inspecter les classes, les interfaces, les champs et les méthodes lors de l'exécution, sans connaître les noms des classes, méthodes, etc. au moment de la compilation. Il est également possible d' instancier de nouveaux objets, d'appeler des méthodes et d'obtenir / définir des valeurs de champ à l'aide de la réflexion.
Un exemple rapide de réflexion Java pour vous montrer à quoi ressemble la réflexion:
Method[] methods = MyObject.class.getMethods();
for(Method method : methods){
System.out.println("method = " + method.getName());
}
Cet exemple obtient l'objet Class de la classe appelée MyObject. En utilisant l'objet class, l'exemple obtient une liste des méthodes de cette classe, itère les méthodes et imprime leurs noms.
Exactement comment tout cela fonctionne est expliqué ici
Edit : Après presque 1 an, je modifie cette réponse car en lisant sur la réflexion, j'ai eu peu d'autres utilisations de la réflexion.
- Spring utilise une configuration de bean telle que:
<bean id="someID" class="com.example.Foo">
<property name="someField" value="someValue" />
</bean>
Lorsque le contexte Spring traite cet élément <bean>, il utilise Class.forName (String) avec l'argument "com.example.Foo" pour instancier cette classe.
Il utilisera ensuite à nouveau la réflexion pour obtenir le setter approprié pour l'élément <property> et définir sa valeur sur la valeur spécifiée.
- Junit utilise Reflection en particulier pour tester les méthodes privées / protégées.
Pour les méthodes privées,
Method method = targetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);
Pour les champs privés,
Field field = targetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);