Invocación de métodos y acceso a campos
Llame a métodos privados y establezca campos inaccesibles mediante Method.invoke y Field.set con setAccessible.
Invocación de métodos y acceso a campos es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.
setAccessible: Omisión de la visibilidad
Llame a field.setAccessible(true) o method.setAccessible(true) para omitir el control de acceso de Java. Es necesario para los miembros privados. En Java 9 y versiones posteriores, requiere un acceso adecuado al módulo.
Field f = User.class.getDeclaredField("name");
f.setAccessible(true);
User u = new User("Alice", 30);
System.out.println(f.get(u)); // "Alice"
f.set(u, "Bob"); // mutate the private field
System.out.println(u.getName()); // "Bob"Lectura de valores de campos
Utilice field.get(instance) para leer el valor de cualquier campo, convertido a un objeto en el caso de los tipos primitivos. Para los campos estáticos, pase null como instancia.
Field f = MyClass.class.getDeclaredField("count");
f.setAccessible(true);
int count = (int) f.get(null); // static field → null instanceAsignación de valores a campos
Utilice field.set(instance, value) para escribir en un campo. El tipo del valor debe coincidir o poder desempaquetarse automáticamente. Asignar un campo final mediante reflexión tiene un comportamiento no definido en las JVM modernas.
Field nameField = User.class.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(user, "Charlie");Invocación de métodos mediante reflexión
Obtenga un objeto Method, llame a setAccessible(true) y, después, invoque el método con method.invoke(instance, args...). El valor devuelto es Object.
Method greet = User.class.getDeclaredMethod("greet", String.class);
greet.setAccessible(true);
String result = (String) greet.invoke(user, "World");
System.out.println(result);Manejo de InvocationTargetException
Si el método invocado lanza una excepción, la reflexión la envuelve en InvocationTargetException. Desenvuélvala con getCause().
try {
method.invoke(obj, args);
} catch (InvocationTargetException e) {
Throwable cause = e.getCause();
System.err.println("Method threw: " + cause.getMessage());
} catch (IllegalAccessException | NoSuchMethodException e) {
System.err.println("Reflection error: " + e.getMessage());
}Invocación de métodos estáticos
Pase null como argumento de instancia al invocar métodos estáticos.
Method parseInt = Integer.class.getDeclaredMethod("parseInt", String.class);
int value = (int) parseInt.invoke(null, "42"); // null = static
System.out.println(value); // 42Creación de instancias mediante un constructor
Obtenga un Constructor, llame a setAccessible(true) si es privado y, después, utilice newInstance(args...).
Constructor<User> ctor = User.class.getDeclaredConstructor(String.class, int.class);
ctor.setAccessible(true);
User u = ctor.newInstance("Diana", 28);
System.out.println(u);Reflexión en frameworks: DI de Spring
Spring utiliza la reflexión para crear instancias de beans e inyectar dependencias. Llama a constructores privados y establece campos privados para configurar el contexto de la aplicación.
Acceso a módulos en Java 9 y versiones posteriores
En Java 9 y versiones posteriores, los módulos restringen setAccessible de forma predeterminada. Si la clase pertenece a un módulo con nombre, es posible que deba abrir el paquete: --add-opens java.base/java.lang=ALL-UNNAMED.
// JVM flag to open a package for reflection:
// --add-opens java.base/java.lang=ALL-UNNAMEDMethodHandles como alternativa más rápida
MethodHandles.lookup().findVirtual() proporciona invocación reflectiva con un rendimiento casi igual al de una llamada directa después de la optimización del JIT. Es la opción preferida en código de bibliotecas crítico para el rendimiento.
MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(User.class, MethodHandles.lookup());
MethodHandle handle = lookup.findVirtual(User.class, "getName", MethodType.methodType(String.class));
String name = (String) handle.invoke(user);Prácticas recomendadas para la reflexión
Almacene en caché los objetos Field/Method; nunca los recupere en bucles críticos. Encapsule la reflexión en clases de servicio. Considere utilizar MethodHandles para mejorar el rendimiento. Siempre que sea posible, prefiera las interfaces a la reflexión.
Comprobación rápida
Cuando un método invocado mediante reflexión lanza una excepción, ¿qué excepción envuelve la causa?
Resumen
Utilice setAccessible(true) para acceder a miembros privados. Invoque métodos mediante method.invoke(). Desenvuelva InvocationTargetException. Almacene en caché los objetos de reflexión. Prefiera MethodHandles en las rutas críticas.
Preguntas frecuentes
¿La lección «Invocación de métodos y acceso a campos» es gratis?
Sí — el texto completo de «Invocación de métodos y acceso a campos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Invocación de métodos y acceso a campos»?
Llame a métodos privados y establezca campos inaccesibles mediante Method.invoke y Field.set con setAccessible. Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Java Academy?
No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Invocación de métodos y acceso a campos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Java Academy?
Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Inspección de clases con Reflection
- Invocación de métodos y acceso a campos
- Proxies dinámicos con InvocationHandler
- Rendimiento de Reflection y alternativas