java reflection tutorial with examples
Este tutorial en video explica qué es Reflection y cómo implementarlo usando la API de Reflection:
La reflexión en Java consiste en inspeccionar y cambiar el comportamiento de un programa en tiempo de ejecución.
Con la ayuda de esta API de reflexión, puede inspeccionar clases, constructores, modificadores, campos, métodos e interfaces en tiempo de ejecución. Por ejemplo, puede obtener el nombre de la clase o puede obtener detalles de los miembros privados de la clase.
Lea todo nuestro Serie de formación JAVA para obtener más información sobre los conceptos de Java.
Aquí hay un tutorial en video sobre la reflexión de Java:
Lo que vas a aprender:
Reflexión en Java
Somos conscientes de que en una clase determinada podemos modificar sus propiedades y métodos en tiempo de compilación y es muy fácil hacerlo. Ya sea que las propiedades y los métodos sean anónimos o tengan nombres, se pueden cambiar a nuestra voluntad durante el tiempo de compilación.
Pero no podemos cambiar estas clases, métodos o campos en tiempo de ejecución sobre la marcha. En otras palabras, es muy difícil cambiar el comportamiento de varios componentes de programación en tiempo de ejecución, especialmente para objetos desconocidos.
El lenguaje de programación Java proporciona una función llamada 'Reflexión' que nos permite modificar el comportamiento en tiempo de ejecución de una clase, campo o método en tiempo de ejecución.
Por tanto, una Reflexión se puede definir como una “Técnica de inspección y modificación del comportamiento en tiempo de ejecución de un objeto desconocido en tiempo de ejecución. Un objeto puede ser una clase, un campo o un método '.
Reflection es una 'Interfaz de programación de aplicaciones' (API) proporcionada por Java.
El proceso de 'Reflexión' se describe a continuación.
En la representación anterior, podemos ver que tenemos un objeto desconocido. Luego usamos la API Reflection en este objeto. Como resultado, podemos modificar el comportamiento de este objeto en tiempo de ejecución.
Por lo tanto, podemos usar Reflection API en nuestros programas con el fin de modificar el comportamiento del objeto. Los objetos pueden ser métodos, interfaces, clases, etc. Inspeccionamos estos objetos y luego cambiamos su comportamiento en tiempo de ejecución usando la API de reflexión.
En Java, 'java.lang' y 'java.lang.reflect' son los dos paquetes que proporcionan clases para la reflexión. La clase especial 'java.lang.Class' proporciona los métodos y propiedades para extraer metadatos mediante los cuales podemos inspeccionar y modificar el comportamiento de la clase.
Usamos la API Reflection proporcionada por los paquetes anteriores para modificar la clase y sus miembros, incluidos campos, métodos, constructores, etc. en tiempo de ejecución. Una característica distintiva de Reflection API es que también podemos manipular los métodos o miembros de datos privados de la clase.
La API de Reflection se utiliza principalmente en:
- La reflexión se utiliza principalmente en herramientas de depuración, JUnit y marcos para inspeccionar y cambiar el comportamiento en tiempo de ejecución.
- IDE (entorno de desarrollo integrado) P.ej. Eclipse IDE, NetBeans, etc.
- Herramientas de prueba, etc.
- Se utiliza cuando su aplicación tiene bibliotecas de terceros y cuando desea conocer las clases y métodos disponibles.
API de reflexión en Java
Usando Reflection API, podemos implementar la reflexión en las siguientes entidades:
- Campo : La clase Field tiene información que usamos para declarar una variable o un campo como un tipo de datos (int, double, String, etc.), modificador de acceso (privado, público, protegido, etc.), nombre (identificador) y valor.
- Método : La clase Method puede ayudarnos a extraer información como el modificador de acceso del método, el tipo de retorno del método, el nombre del método, los tipos de parámetros del método y los tipos de excepción generados por el método.
- Constructor : La clase Constructor proporciona información sobre el constructor de la clase que incluye el modificador de acceso del constructor, el nombre del constructor y los tipos de parámetros.
- Editar : La clase Modifier nos da información sobre un modificador de acceso específico.
Todas las clases anteriores son parte del paquete java.lang.reflect. A continuación, discutiremos cada una de estas clases y usaremos ejemplos de programación para demostrar la reflexión sobre estas clases.
Primero comencemos con la clase java.lang.Class.
Clase java.lang.Class
La clase java.lang.The contiene toda la información y datos sobre clases y objetos en tiempo de ejecución. Esta es la clase principal que se usa para la reflexión.
La clase java.lang.Class proporciona:
- Métodos para recuperar metadatos de clases en tiempo de ejecución.
- Métodos para inspeccionar y modificar el comportamiento de una clase en tiempo de ejecución.
Crear objetos java.lang.Class
Podemos crear objetos de java.lang.Class usando una de las siguientes opciones.
por qué elige la pregunta de la entrevista de prueba de software
# 1) extensión .class
La primera opción para crear un objeto de Clase es mediante la extensión .class.
Por ejemplo,si Test es una clase, entonces podemos crear un objeto Class de la siguiente manera:
|_+_|Luego podemos usar obj_test para realizar la reflexión ya que este objeto tendrá toda la información sobre la clase Test.
# 2) método forName ()
El método forName () toma el nombre de la clase como argumento y devuelve el objeto Class.
Por ejemplo,el objeto de la clase Test se puede crear de la siguiente manera:
|_+_|# 3) método getClas ()
El método getClass () usa el objeto de una clase para obtener el objeto java.lang.Class.
Por ejemplo,considere el siguiente fragmento de código:
|_+_|En la primera línea, creamos un objeto de la clase Test. Luego, usando este objeto, llamamos al método 'getClass ()' para obtener un objeto obj_test de java.lang.Class.
Obtén modificadores de acceso y superclase
java.lang.class proporciona un método 'getSuperClass ()' que se utiliza para obtener la superclase de cualquier clase.
De manera similar, proporciona un método getModifier () que devuelve el modificador de acceso de la clase.
El siguiente ejemplo demuestra el método getSuperClass ().
|_+_|Producción
En el ejemplo de programación anterior, una Persona de interfaz se define con un método único 'display ()'. Luego definimos una clase Student implementando la interfaz de persona. En el método principal, usamos el método getClass () para recuperar el objeto Class y luego acceder al padre o superclase del objeto Student usando el método getSuperClass ().
Obtener interfaces
Si la clase implementa algunas interfaces, entonces podemos obtener los nombres de estas interfaces usando el método getInterfaces () de java.lang.Class. Para ello, tenemos que realizar una reflexión sobre la clase Java.
El siguiente ejemplo de programación muestra el uso del método getInterfaces () en Java Reflection.
|_+_|Producción
En el programa anterior, hemos definido dos interfaces, es decir, Animals y PetAnimals. Luego definimos una clase Dog, que implementa ambas interfaces.
En el método principal, recuperamos el objeto de la clase Dog en java.lang.Class para realizar la reflexión. Luego usamos el método getInterfaces () para recuperar las interfaces que son implementadas por la clase Dog.
Reflexión: obtener valor de campo
Como ya se mencionó, el paquete java.lang.reflect proporciona la clase Field que nos ayuda a reflejar el campo o los datos miembros de la clase.
A continuación se enumeran los métodos proporcionados por la clase Field para la reflexión de un campo.
Método | Descripción |
---|---|
getField ('fieldName') | Devuelve el campo (público) con un nombre de campo especificado. |
getFields () | Devuelve todos los campos públicos (tanto para clase como para superclase). |
getDeclaredFields () | Recupera todos los campos de la clase. |
getModifier () | Devuelve una representación entera del modificador de acceso del campo. |
set (classObject, valor) | Asigna el valor especificado al campo. |
obtener (classObject) | Recupera el valor del campo. |
setAccessible (booleano) | Haga que el campo privado sea accesible pasando verdadero. |
getDeclaredField ('fieldName') | Devuelve el campo con un nombre especificado. |
A continuación se presentan dos ejemplos de reflexión que demuestran la reflexión sobre el ámbito público y privado.
El programa Java a continuación demuestra la reflexión en un campo público.
|_+_|Producción
En este programa, hemos declarado una clase 'Estudiante' que tiene un campo público StudentName. Luego, utilizando la interfaz API de la clase Field, realizamos una reflexión sobre el campo StudentName y recuperamos su valor y modificador de acceso.
El siguiente programa realiza una reflexión sobre un campo privado de la clase. Las operaciones son similares excepto que se realiza una llamada de función adicional para el campo privado. Tenemos que llamar a setAccessible (true) para el campo privado. Luego realizamos una reflexión sobre este campo de manera similar al campo público.
|_+_|Producción
Reflexión: Método
De manera similar a los campos de la clase, también podemos realizar una reflexión sobre los métodos de la clase y modificar su comportamiento en tiempo de ejecución. Para esto, usamos la clase Method del paquete java.lang.reflect.
A continuación se enumeran las funciones proporcionadas por la clase Método para la reflexión del método de la clase.
Método | Descripción |
---|---|
getMethods () | Recupera todos los métodos públicos definidos en la clase y su superclase. |
getDeclaredMethod () | Devuelve métodos declarados en la clase. |
getName () | Devuelve los nombres de los métodos. |
getModifiers () | Devuelve una representación entera del modificador de acceso del método. |
getReturnType () | Devuelve el tipo de retorno del método. |
El siguiente ejemplo muestra el reflejo de los métodos de clase en Java utilizando las API anteriores.
|_+_|Producción
En el programa anterior, vemos que el método getDeclaredMethods devuelve la matriz de métodos declarados por la clase. Luego iteramos a través de esta matriz y mostramos la información de cada método.
Reflexión: Constructor
Podemos usar la clase 'Constructor' del paquete java.lang.reflect para inspeccionar y modificar los constructores de una clase Java.
La clase constructora proporciona los siguientes métodos para este propósito.
Método | Descripción |
---|---|
getConstructors () | Devuelve todos los constructores declarados en clase y su superclase. |
getDeclaredConstructor () | Devuelve todos los constructores declarados. |
getName () | Recupera el nombre del constructor. |
getModifiers () | Devuelve la representación entera del modificador de acceso de los constructores. |
getParameterCount () | Devuelve el número total de parámetros de un constructor. |
El siguiente ejemplo de reflexión demuestra la reflexión de los constructores de una clase en Java. Al igual que la reflexión del método, aquí también el método getDeclaredConstructors devuelve una matriz de constructores para una clase. Luego, recorremos esta matriz de constructores para mostrar información sobre cada constructor.
|_+_|Producción
Inconvenientes de la reflexión
La reflexión es poderosa, pero no debe usarse de forma indiscriminada. Si es posible operar sin usar la reflexión, entonces es preferible evitar su uso.
A continuación se enumeran algunos inconvenientes de Reflexión:
- Sobrecarga de rendimiento: Aunque la reflexión es una característica poderosa, las operaciones reflectantes aún tienen un rendimiento más lento que las operaciones no reflectantes. Por lo tanto, debemos evitar el uso de reflejos en aplicaciones de rendimiento crítico.
- Restricciones de seguridad: Como la reflexión es una función en tiempo de ejecución, es posible que requiera permisos en tiempo de ejecución. Entonces, para las aplicaciones que requieren que el código se ejecute en una configuración de seguridad restringida, la reflexión puede no ser de utilidad.
- Exposición de internos: Al usar la reflexión, podemos acceder a campos y métodos privados en una clase. Por lo tanto, la reflexión rompe la abstracción que puede hacer que el código sea inportable y disfuncional.
Preguntas frecuentes
P # 1) ¿Por qué se usa Reflection en Java?
Responder: Mediante la reflexión podemos inspeccionar clases, interfaces, constructores, campos y métodos en tiempo de ejecución, incluso si son anónimos en tiempo de compilación. Esta inspección nos permite modificar el comportamiento de estas entidades en tiempo de ejecución.
Q #2) ¿Dónde se usa Reflection?
Responder: La reflexión se usa para escribir marcos que interoperan con clases definidas por el usuario, en las que el programador ni siquiera sabe cuáles serán las clases u otras entidades.
Q #3) ¿Java Reflection es lento?
Responder: Sí, es más lento que el código de no reflexión.
Q #4) ¿Java Reflection es malo?
Responder: En cierto modo, sí. En primer lugar, perdemos la seguridad en tiempo de compilación. Sin seguridad en tiempo de compilación, podríamos obtener errores en tiempo de ejecución que pueden afectar a los usuarios finales. También será difícil depurar el error.
Q #5) ¿Cómo se detiene una reflexión en Java?
Responder: Simplemente evitamos el uso de la reflexión escribiendo operaciones de no reflexión. O tal vez podamos usar algunos mecanismos genéricos como una validación personalizada con reflexión.
Más sobre la reflexión de Java
El paquete java.lang.reflect tiene las clases e interfaces para hacer la reflexión. Y java.lang.class se puede utilizar como punto de entrada para la reflexión.
Cómo obtener los objetos de la clase:
1. Si tiene una instancia de un objeto,
clase c = obj.getclass ();
2. Si conoce el tipo de clase,
clase c = type.getClass ();
3. Si conoce el nombre de la clase,
Clase c = Class.forName ('com.demo.Mydemoclass');
Cómo conseguir los miembros de la clase:
Los miembros de la clase son campos (variables de clase) y métodos.
- getFields () - Se usa para obtener todos los campos excepto los privados.
- getDeclaredField () - Solía obtener los campos privados.
- getDeclaredFields () - Se utiliza para obtener los campos público y privado.
- getMethods () - Se usa para obtener todos los métodos excepto los privados.
- getDeclaredMethods () –Utilizado para obtener los métodos públicos y privados.
Programas de demostración:
ReflectionHelper.java:
Esta es la clase donde vamos a inspeccionar usando la API de reflexión.
cómo agregar un elemento a una matriz java|_+_|
ReflectionDemo.java
|_+_|
Conclusión
Este tutorial explica en detalle la API de Reflection en Java. Vimos cómo realizar la reflexión de clases, interfaces, campos, métodos y constructores junto con algunos inconvenientes de la reflexión.
La reflexión es una característica relativamente avanzada en Java, pero debería ser utilizada por programadores que tengan una fortaleza en el lenguaje. Esto se debe a que puede provocar errores y resultados inesperados si no se utiliza con precaución.
Aunque la reflexión es poderosa, debe usarse con cuidado. No obstante, mediante la reflexión podemos desarrollar aplicaciones que desconocen las clases y otras entidades hasta el tiempo de ejecución.
=> Eche un vistazo a la guía para principiantes de Java aquí.
Lectura recomendada
- Tutorial de clase de escáner de Java con ejemplos
- Clase Java Integer y Java BigInteger con ejemplos
- Tutorial de JAVA para principiantes: más de 100 tutoriales prácticos en vídeo de Java
- Introducción al lenguaje de programación Java - Tutorial en vídeo
- ¿Qué es Java Vector | Tutorial de clase de vector de Java con ejemplos
- Tutorial de interfaz Java y clase abstracta con ejemplos
- Método Java substring () - Tutorial con ejemplos
- Tutorial de Java Collections Framework (JCF)