Java Reflection es bastante potente y puede ser muy útil. Java Reflection hace posible inspeccionar clases, interfaces, campos y métodos en tiempo de ejecución, sin conocer los nombres de las clases, métodos, etc. en tiempo de compilación. También es posible crear instancias de nuevos objetos, invocar métodos y obtener / establecer valores de campo utilizando la reflexión.
Un ejemplo rápido de Java Reflection para mostrarle cómo se ve el uso de la reflexión:
Method[] methods = MyObject.class.getMethods();
for(Method method : methods){
System.out.println("method = " + method.getName());
}
Este ejemplo obtiene el objeto Class de la clase llamada MyObject. Usando el objeto de clase, el ejemplo obtiene una lista de los métodos en esa clase, itera los métodos e imprime sus nombres.
Aquí se explica exactamente cómo funciona todo esto
Editar : Después de casi 1 año, estoy editando esta respuesta, ya que mientras leía sobre la reflexión, obtuve algunos usos más de Reflection.
- Spring utiliza la configuración de frijol como:
<bean id="someID" class="com.example.Foo">
<property name="someField" value="someValue" />
</bean>
Cuando el contexto Spring procesa este elemento <bean>, usará Class.forName (String) con el argumento "com.example.Foo" para crear una instancia de esa clase.
Luego volverá a usar la reflexión para obtener el setter apropiado para el elemento <property> y establecer su valor en el valor especificado.
- Junit usa Reflection especialmente para probar métodos privados / protegidos.
Para métodos privados,
Method method = targetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);
Para campos privados,
Field field = targetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);