Reflexión — es un mecanismo que permite explorar y modificar la estructura y el comportamiento de clases, objetos, métodos y campos durante la ejecución del programa. Se implementa a través del paquete java.lang.reflect.
Permite:
Ejemplo:
import java.lang.reflect.Method; public class ReflectionExample { public void greet() { System.out.println("¡Hola!"); } 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); // Imprimirá: ¡Hola! } }
Ventajas:
Desventajas/riesgos:
¿Se puede acceder a campos y métodos privados de una clase mediante reflexión, y cuáles son las consecuencias de esto?
Respuesta: Sí, es posible mediante el método setAccessible(true) en Field o Method:
Field field = clazz.getDeclaredField("privateField"); field.setAccessible(true); field.set(obj, "value");
Esto viola la encapsulación de la clase y está asociado con un riesgo: la situación se vuelve frágil, pueden ocurrir errores de seguridad, y en nuevas versiones de JVM, tales acciones pueden ser restringidas por políticas de acceso.
Historia
En un gran proyecto para el mapeo automático de DTO a través de reflexión, los campos con el tipo "Optional" no se manejaron correctamente, lo que llevó a NullPointerException durante el procesamiento masivo de datos, ya que el paquete de reflexión no diferenciaba entre valores Optional y null.
Historia
En un software bancario, se implementó el acceso a campos privados a través de setAccessible(true) para la serialización. Después de una actualización de JVM, el comportamiento cambió, el acceso al campo privado se cerró, y una funcionalidad importante de serialización dejó de funcionar repentinamente en producción.
Historia
En un framework ORM, al generar objetos proxy, se olvidó refrescar la caché de reflexión después de cambiar el esquema de datos. Como resultado, el sistema generaba excepciones impredecibles al trabajar con nuevos campos de clases que no se reflejaban en la caché.