En Java, ¿qué es Reflection y por qué es útil?

La reflexión es un concepto muy importante e interesante que Java ha introducido hace mucho tiempo. Si tiene una buena cantidad de experiencias en el uso de Java, puede saber cómo funciona Java en tiempo de ejecución. Si tiene experiencia en Java EE, es posible que haya escuchado o usado DI (Inyección de dependencia). Incluso puede considerar casos simples de prueba unitaria que escribimos para validar nuestro método de clase. Estos son los ejemplos generales en los que la reflexión se usa de forma generalizada. Básicamente, si necesita analizar una clase en tiempo de ejecución, como si necesita saber cuántos métodos tiene la clase, cuántos campos privados tiene la clase, qué interfaces implementa la clase de esta manera. Incluso un gran ejemplo sería su IDE de Eclipse donde presione ”. después de un objeto, enumera todos los campos públicos, así como los métodos que se pueden usar. Básicamente, Eclipse Intellisense está utilizando la reflexión para analizar clases en tiempo de ejecución.

Java Reflection tiene muchos casos de uso para trabajar. Estos son ejemplos generales para darle una pista de lo que es. Puede consultar el siguiente enlace para obtener más información sobre Java Reflection API con más detalles.

Tutorial de reflexión de Java: la guía definitiva (descarga en PDF) | Java Code Geeks

Reflection es un sistema que le permite aprender sobre una clase y sus métodos, constructores y campos. También puede consultar clases específicas por nombre (usando Class.forName ). Ejemplo rápido:

Class mathClass = Math.class;
Method cbrtMethod = mathClass.getMethod("cbrt", double.class);
System.out.println(cbrtMethod.invoke(null, 27.0));

Aquí hay otro ejemplo, que involucra métodos de instancia de llamada usando la reflexión:

Class stringClass = String.class;
Method toLCMethod = stringClass.getMethod("toLowerCase");
System.out.println(toLCMethod.invoke("Hello, world!"));

Aunque los dos ejemplos anteriores son artificiales, existen algunos usos no artificiales. Aquí hay uno que involucra invocar un constructor de copia (con lo cual me refiero a un constructor que toma su propio tipo como único parámetro):

public static T copyConstruct(Class cls, T obj) throws ... {
return cls.getConstructor(cls).newInstance(obj);
}

Muy a menudo, la reflexión se usa para situaciones de carga de servicios (donde la clase que se usará para un servicio dado se configura dinámicamente). Otro caso de uso es para invocar métodos que solo están disponibles en versiones más nuevas de Java, donde aún desea conservar la compatibilidad con versiones anteriores de Java.

La reflexión, como su nombre lo indica, es una capacidad en Java para permitirle mirar (reflexionar) sobre las clases en tiempo de ejecución en lugar de en tiempo de compilación. Le permite examinar una clase para ver qué métodos, miembros, interfaces, etc. que contiene o implementa.

¿Por qué es útil? Bueno, subyace en todo el lado empresarial (JEE) del lenguaje. Cuando hablamos de propiedades en EJB, JSP, JSF, Hibernate, iBatis / MyBatis, JavaBeans y similares, en realidad estamos hablando de un estándar de reflexión en tiempo de ejecución. Una propiedad es un conjunto de métodos escritos en un formato particular que les permite ejecutarse en tiempo de ejecución sin que el código tenga conocimiento previo de ellos. La pila de tecnología web Java literalmente no funcionaría sin Reflection.

También es la base de los comportamientos de tiempo de ejecución más dinámicos o perezosos de los marcos más nuevos y los lenguajes JVM. Al mover la mayor parte de la funcionalidad a la pila de tiempo de ejecución, adquiere mucha más flexibilidad en cómo puede ejecutar varias funciones.

La reflexión es una característica muy interesante dentro de Java. La forma más sencilla de explicarlo es que puede trabajar con código que al momento de escribir su propio código, no sabe que existe y lo más probable es que no exista. Lo único que sabes es que existirá y ese es el poder de la reflexión.

Para explicar la reflexión, voy a usar el ejemplo de un juego que hemos creado que admite totalmente la modificación del juego para agregar nuevos mobs. Para generar una mafia debes llamar al método spawn que toma un objeto de clase. Nuestro método creará un objeto de esa clase y lo colocará en el mundo.

Ahora para hacer esto, nuestro método obtendrá el constructor para la clase usando el método getConstructor () y luego creará un objeto a partir de ese constructor usando el método newInstance (). Ambos métodos cambian cuando su constructor no está vacío. Para obtener el constructor, debe pasar los objetos de clase para cada uno de los parámetros que se necesitarían y luego, para crear el objeto, simplemente debe ingresar los parámetros necesarios para el constructor.

La razón por la que esto es tan bueno es porque cualquiera podría agregar nuevas clases y su código nunca se rompería siempre que supiera cuál era el constructor y hay formas de saberlo a través de ellos diciéndole y también posiblemente a través de la reflexión (he nunca busqué en la lista de constructores, pero creo que recuerdo algo al respecto en mi lectura y tal vez si lo investigas podrías aprender aún más).

Reflection se usa en muchos programas y le permite hacer más de lo que acabo de decir, ya que esto es solo una fracción de su verdadero poder. Algunos otros ejemplos de cosas que puede hacer son enumerar todos los métodos y variables dentro de una clase, así como acceder a métodos y variables privadas dentro de una clase. Se usa comúnmente en bibliotecas y API donde las personas agregarán código al suyo y también es la característica principal utilizada en programas que analizan su código en busca de errores y programas que construyen una gran cantidad de objetos de su clase para ver la eficiencia.

Java Reflection es un proceso de examinar o modificar el comportamiento del tiempo de ejecución de una clase en tiempo de ejecución .

La clase java.lang.Class proporciona muchos métodos que pueden usarse para obtener metadatos, examinar y cambiar el comportamiento del tiempo de ejecución de una clase.

La API de Reflection se usa principalmente en:

  • IDE (Entorno de desarrollo integrado), por ejemplo, Eclipse, MyEclipse, NetBeans, etc.
  • Depurador
  • Herramientas de prueba, etc.

La reflexión es importante, ya que le permite escribir programas que no tienen que “saber” todo en tiempo de compilación, lo que los hace más dinámicos, ya que pueden vincularse en tiempo de ejecución. El código se puede escribir en interfaces conocidas, pero las clases reales que se utilizarán se pueden instanciar utilizando la reflexión de los archivos de configuración.

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:

Método [] métodos = MyObject.class.getMethods (); for (Método método: métodos) {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.

La reflexión en Java es la capacidad de examinar y / o modificar las propiedades o el comportamiento de un objeto en tiempo de ejecución. La reflexión permite inspeccionar clases, 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.

Lea más en el siguiente enlace,

Uso de Reflection API en Java con ejemplo

Reflection puede ayudarlo a inspeccionar y ejecutar métodos y variables de una clase conocida o desconocida

Ejemplo:

Reflexión de Java: lectura de un archivo de clase desconocido

Espero que ayude 🙂