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.
- ¿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étodo | Descripción |
---|---|
1) cadena pública getName() | devuelve el nombre de la clase |
2) Clase pública estática para Nombre (String className) lanza ClassNotFoundException | carga la clase y devuelve la referencia de la clase Class. |
3) Objeto público newInstance() lanza InstantiationException, IllegalAccessException | crea 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 SecurityException | devuelve el número total de campos de esta clase. |
9) Método público [] getDeclaredMethods() lanza SecurityException | devuelve el número total de métodos de esta clase. |
10) Constructor público[] getDeclaredConstructors() lanza SecurityException | devuelve 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, SecurityException | devuelve 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.