Dominando la Reflexión en Java: Inspeccionando clases, métodos y campos en tiempo de ejecución
Dominando la Reflexión en Java
Aprende cómo la API de reflexión de Java te permite inspeccionar y modificar clases, métodos, campos y constructores durante la ejecución, mejorando la flexibilidad y permitiendo comportamientos dinámicos poderosos.
En Java, la reflexión te permite examinar y manipular clases, interfaces, constructores, métodos y campos mientras el programa se está ejecutando.
Java proporciona la clase Class, que encapsula metadatos sobre una clase o interfaz. Una instancia de Class es la puerta de entrada a las capacidades de reflexión.
Obteniendo un objeto Class
Para realizar reflexión primero necesitas un objeto Class. Hay tres formas comunes de obtenerlo:
- Usando
Class.forName()Class<Perro> clazz = Class.forName("com.ejemplo.Perro");El método acepta el nombre de clase completamente calificado y carga la clase si no lo está ya.
- Usando
getClass()en una instanciaPerro perro = new Perro(); Class<Perro> clazz = perro.getClass();Recupera la clase en tiempo de ejecución del objeto.
- Usando el literal
.classClass<Perro> clazz = Perro.class;Proporciona una referencia en tiempo de compilación al objeto
Class.
Una vez que tienes una instancia de Class, puedes consultar sus métodos, campos, constructores y anotaciones.
Ejemplo práctico: Inspeccionando la clase Perro
import java.lang.Class; import java.lang.reflect.*; class Animal {} public class Perro extends Animal { public void mostrar() { System.out.println("Soy un perro."); } } public class Main { public static void main(String[] args) { try { Perro perro = new Perro(); Class<Perro> clazz = perro.getClass(); System.out.println("Nombre: " + clazz.getName()); System.out.println("Modificador: " + Modifier.toString(clazz.getModifiers())); System.out.println("Superclase: " + clazz.getSuperclass().getName()); } catch (Exception e) { e.printStackTrace(); } } }
Salida
Nombre: com.ejemplo.Perro Modificador: public Superclase: com.ejemplo.Animal
En este fragmento, creamos una instancia de Perro, obtuvimos su objeto Class y consultamos el nombre de la clase, modificador de acceso y superclase.
Para mayor profundidad sobre Class, consulta la documentación oficial de Java Class.
Explorando campos, métodos y constructores
El paquete java.lang.reflect ofrece clases dedicadas para introspeccionar miembros específicos:
Method– detalles sobre métodos.Field– detalles sobre campos.Constructor– detalles sobre constructores.
Reflexionando Métodos
La clase Method expone metadatos como nombre, tipo de retorno y modificadores. A continuación un ejemplo conciso:
import java.lang.reflect.*; class Perro { public void mostrar() { System.out.println("Soy un perro."); } private void hacerSonido() { System.out.println("Guau Guau"); } } public class Main { public static void main(String[] args) { try { Perro perro = new Perro(); Method[] metodos = perro.getClass().getDeclaredMethods(); for (Method m : metodos) { System.out.println("Nombre Método: " + m.getName()); System.out.println("Modificador: " + Modifier.toString(m.getModifiers())); System.out.println("Tipo Retorno: " + m.getReturnType()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
Salida
Nombre Método: mostrar Modificador: public Tipo Retorno: void Nombre Método: hacerSonido Modificador: private Tipo Retorno: void
Para una lista completa de utilidades de Method, visita la documentación oficial de Method.
Reflexionando Campos
Los campos pueden accederse y modificarse en tiempo de ejecución. La clase Field provee get, set y utilidades de modificadores. Ejemplo:
import java.lang.reflect.*; class Perro { public String tipo; private String color; } public class Main { public static void main(String[] args) { try { Perro perro = new Perro(); Class<Perro> clazz = perro.getClass(); // Campo público Field campoTipo = clazz.getField("tipo"); campoTipo.set(perro, "labrador"); System.out.println("Valor: " + campoTipo.get(perro)); System.out.println("Modificador: " + Modifier.toString(campoTipo.getModifiers())); // Campo privado Field campoColor = clazz.getDeclaredField("color"); campoColor.setAccessible(true); campoColor.set(perro, "marrón"); System.out.println("Valor: " + campoColor.get(perro)); System.out.println("Modificador: " + Modifier.toString(campoColor.getModifiers())); } catch (Exception e) { e.printStackTrace(); } } }
Salida
Valor: labrador Modificador: public Valor: marrón Modificador: private
Explora la documentación de la clase Field para uso avanzado.
Reflexionando Constructores
Los constructores se introspeccionan vía la clase Constructor. El siguiente código lista todos los constructores de Perro:
import java.lang.reflect.*; class Perro { public Perro() {} private Perro(int edad) {} } public class Main { public static void main(String[] args) { try { Constructor<Perro>[] cons = Perro.class.getDeclaredConstructors(); for (Constructor<Perro> c : cons) { System.out.println("Nombre Constructor: " + c.getName()); System.out.println("Modificador: " + Modifier.toString(c.getModifiers())); System.out.println("Parámetros: " + c.getParameterCount()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
Salida
Nombre Constructor: Perro Modificador: public Parámetros: 0 Nombre Constructor: Perro Modificador: private Parámetros: 1
Para más detalles, ver la documentación de Constructor.
Java
- Palabra clave final en Java: Variables, métodos y clases
- Operador instanceof en Java: Guía completa
- Dominando la herencia en Java: Conceptos, tipos y ejemplos prácticos
- Entendiendo las clases anidadas estáticas en Java: Uso, diferencias y ejemplos
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Patrón Singleton en Java explicado: Cómo implementarlo y usarlo de forma segura
- Dominando ArrayList en Java: Operaciones, métodos y mejores prácticas
- Clase Stack de Java: Guía Completa de Uso y Métodos
- Dominando ObjectOutputStream de Java: Serialización, Métodos y Ejemplos Prácticos
- Dominando Java Generics: Construyendo Código Reutilizable y Type-Safe
- Dominando las operaciones de archivos en Java con java.io: creación, lectura, escritura y eliminación