Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Java

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:

  1. 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.

  2. Usando getClass() en una instancia
    Perro perro = new Perro(); Class<Perro> clazz = perro.getClass();

    Recupera la clase en tiempo de ejecución del objeto.

  3. Usando el literal .class
    Class<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:


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

  1. Palabra clave final en Java: Variables, métodos y clases
  2. Operador instanceof en Java: Guía completa
  3. Dominando la herencia en Java: Conceptos, tipos y ejemplos prácticos
  4. Entendiendo las clases anidadas estáticas en Java: Uso, diferencias y ejemplos
  5. Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
  6. Patrón Singleton en Java explicado: Cómo implementarlo y usarlo de forma segura
  7. Dominando ArrayList en Java: Operaciones, métodos y mejores prácticas
  8. Clase Stack de Java: Guía Completa de Uso y Métodos
  9. Dominando ObjectOutputStream de Java: Serialización, Métodos y Ejemplos Prácticos
  10. Dominando Java Generics: Construyendo Código Reutilizable y Type-Safe
  11. Dominando las operaciones de archivos en Java con java.io: creación, lectura, escritura y eliminación