logo

API de reflexión de Java

Reflexión de Java es un Proceso de examinar o modificar el comportamiento en tiempo de ejecución de una clase en tiempo de ejecución. .

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

Los paquetes java.lang y java.lang.reflect proporcionan clases para la reflexión de Java.

donde se usa

La API Reflection se utiliza principalmente en:

  • IDE (entorno de desarrollo integrado), por ejemplo, Eclipse, MyEclipse, NetBeans, etc.
  • Depurador
  • Herramientas de prueba, etc.
¿Sabes?
  • ¿De cuántas maneras podemos obtener la instancia de la clase Class?
  • ¿Cómo crear la herramienta javap?
  • ¿Cómo crear la herramienta Appletviewer?
  • ¿Cómo acceder al método privado desde fuera de la clase?

clase java.lang.Class

La clase java.lang.Class realiza principalmente dos tareas:

android.process.acore sigue deteniéndose
  • proporciona métodos para obtener los metadatos de una clase en tiempo de ejecución.
  • proporciona métodos para examinar y cambiar el comportamiento en tiempo de ejecución de una clase.

Métodos comúnmente utilizados de la clase Class:

MétodoDescripción
1) cadena pública getName()devuelve el nombre de la clase
2) Clase pública estática para Nombre (String className) lanza ClassNotFoundExceptioncarga la clase y devuelve la referencia de la clase Class.
3) Objeto público newInstance() lanza InstantiationException, IllegalAccessExceptioncrea una nueva instancia.
4) isInterface booleano público ()comprueba si es interfaz.
5) público booleano isArray ();comprueba si es una matriz.
6) booleano público esPrimitivo()comprueba si es primitivo.
7) Clase pública getSuperclass()devuelve la referencia de clase de superclase.
8) campo público [] getDeclaredFields() lanza SecurityExceptiondevuelve el número total de campos de esta clase.
9) Método público [] getDeclaredMethods() lanza SecurityExceptiondevuelve el número total de métodos de esta clase.
10) Constructor público[] getDeclaredConstructors() lanza SecurityExceptiondevuelve el número total de constructores de esta clase.
11) Método público getDeclaredMethod (nombre de cadena, clase [] tipos de parámetros) lanza NoSuchMethodException, SecurityExceptiondevuelve la instancia de clase del método.

¿Cómo obtener el objeto de la clase Class?

Hay 3 formas de obtener la instancia de la clase Class. Son los siguientes:

  • Método forName() de la clase Class
  • método getClass() de la clase de objeto
  • la sintaxis .class

1) método forName() de la clase Class

  • se utiliza para cargar la clase dinámicamente.
  • devuelve la instancia de la clase Class.
  • Debe usarse si conoce el nombre completo de la clase. No puede usarse para tipos primitivos.

Veamos el ejemplo simple del método forName().

Nombre del archivo: Test.java

diferencia entre $ y $$
 class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } } 

Producción:

 Simple 

2) método getClass() de la clase Objeto

Devuelve la instancia de la clase Class. Debe usarse si conoce el tipo. Además, se puede utilizar con primitivas.

Nombre del archivo: Test.java

 class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } } 

Producción:

Simple 

3) La sintaxis .class

Si un tipo está disponible, pero no hay ninguna instancia, entonces es posible obtener una Clase agregando '.class' al nombre del tipo. También se puede utilizar para tipos de datos primitivos.

Nombre del archivo: Test.java

un objeto en java
 class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } } 

Producción:

 boolean Test 

Determinando el objeto de clase

Los siguientes métodos de clase Class se utilizan para determinar el objeto de clase:

1) isInterface booleano público(): Determina si el objeto Clase especificado representa un tipo de interfaz.

2) isArray público booleano(): Determina si este objeto Class representa una clase de matriz.

3) booleano público esPrimitivo(): Determina si el objeto Clase especificado representa un tipo primitivo.

Veamos el ejemplo simple de API de reflexión para determinar el tipo de objeto.

cadena de java

Nombre del archivo: Test.java

 class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } } 

Producción:

fusionar ordenar java
 false true 

Pros y contras de la reflexión

La reflexión de Java siempre debe utilizarse con precaución. Si bien el reflejo ofrece muchas ventajas, también tiene algunas desventajas. Analicemos primero las ventajas.

Ventajas: La inspección de interfaces, clases, métodos y campos durante el tiempo de ejecución es posible mediante la reflexión, incluso sin utilizar sus nombres durante el tiempo de compilación. También es posible llamar a métodos, crear una instancia de borrado o establecer el valor de los campos mediante la reflexión. Ayuda en la creación de entornos de desarrollo visual y navegadores de clases que ayudan a los desarrolladores a escribir el código correcto.

Contras: Usando la reflexión, uno puede romper los principios de encapsulación. Es posible acceder a los métodos y campos privados de una clase mediante la reflexión. Por tanto, la reflexión puede filtrar datos importantes al mundo exterior, lo cual es peligroso. Por ejemplo, si uno accede a los miembros privados de una clase y le establece un valor nulo, entonces el otro usuario de la misma clase puede obtener la excepción NullReferenceException, y este comportamiento no es el esperado.

Otro inconveniente es la sobrecarga de rendimiento. Dado que los tipos en reflexión se resuelven dinámicamente, no se puede realizar la optimización de JVM (Java Virtual Machine). Por tanto, las operaciones que realizan las reflexiones suelen ser lentas.

Conclusión

Debido a las desventajas mencionadas anteriormente, generalmente es aconsejable evitar el uso de la reflexión. Es una función avanzada que sólo deben utilizar programadores o desarrolladores que tengan un buen conocimiento de los conceptos básicos del lenguaje. ¡Recuerda siempre! Siempre que se utiliza la reflexión, la seguridad de la aplicación se ve comprometida.


Temas siguientes del tutorial de la API de Reflection

método nuevaInstancia()
Entendiendo la herramienta javap
creando herramienta javap
crear herramienta appletviewer
Llamar al método privado de otra clase.