En este tutorial aprenderemos la reflexión, una característica de la programación Java que nos permite inspeccionar y modificar clases, métodos, etc.
En Java, la reflexión nos permite inspeccionar y manipular clases, interfaces, constructores, métodos y campos en tiempo de ejecución.
Hay una clase en Java llamada Class
que mantiene toda la información sobre objetos y clases en tiempo de ejecución. El objeto de Clase se puede utilizar para realizar una reflexión.
Reflexión de las clases de Java
Para reflejar una clase Java, primero necesitamos crear un objeto de Class.
Y, utilizando el objeto, podemos llamar a varios métodos para obtener información sobre métodos, campos y constructores presentes en una clase.
Existen tres formas de crear objetos de Clase:
1. Usando el método forName ()
class Dog (… ) // create object of Class // to reflect the Dog class Class a = Class.forName("Dog");
Aquí, el forName()
método toma el nombre de la clase a reflejar como argumento.
2. Usando el método getClass ()
// create an object of Dog class Dog d1 = new Dog(); // create an object of Class // to reflect Dog Class b = d1.getClass();
Aquí, estamos usando el objeto de la clase Dog para crear un objeto de Class.
3. Usando la extensión .class
// create an object of Class // to reflect the Dog class Class c = Dog.class;
Ahora que sabemos cómo podemos crear objetos de Class
. Podemos usar este objeto para obtener información sobre la clase correspondiente en tiempo de ejecución.
Ejemplo: Reflexión de clase Java
import java.lang.Class; import java.lang.reflect.*; class Animal ( ) // put this class in different Dog.java file public class Dog extends Animal ( public void display() ( System.out.println("I am a dog."); ) ) // put this in Main.java file class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // get name of the class String name = obj.getName(); System.out.println("Name: " + name); // get the access modifier of the class int modifier = obj.getModifiers(); // convert the access modifier to string String mod = Modifier.toString(modifier); System.out.println("Modifier: " + mod); // get the superclass of Dog Class superClass = obj.getSuperclass(); System.out.println("Superclass: " + superClass.getName()); ) catch (Exception e) ( e.printStackTrace(); ) ) )
Salida
Nombre: Perro Modificador: público Superclase: Animal
En el ejemplo anterior, hemos creado una superclase: Animal y una subclase: Perro. Aquí, estamos tratando de inspeccionar la clase Perro.
Note la declaración,
Class obj = d1.getClass();
Aquí, estamos creando un objeto obj de Class usando el getClass()
método. Usando el objeto, estamos llamando a diferentes métodos de Class.
- obj.getName () : devuelve el nombre de la clase
- obj.getModifiers () : devuelve el modificador de acceso de la clase
- obj.getSuperclass () : devuelve la superclase de la clase
Para obtener más información Class
, visite Java Class (documentación oficial de Java).
Nota : Estamos usando la Modifier
clase para convertir el modificador de acceso entero en una cadena.
Reflejo de campos, métodos y constructores
El paquete java.lang.reflect
proporciona clases que pueden usarse para manipular miembros de clase. Por ejemplo,
- Clase de método : proporciona información sobre los métodos de una clase.
- Clase de campo : proporciona información sobre los campos de una clase.
- Clase de constructor : proporciona información sobre los constructores de una clase.
1. Reflexión de los métodos de Java
La Method
clase proporciona varios métodos que se pueden utilizar para obtener información sobre los métodos presentes en una clase. Por ejemplo,
import java.lang.Class; import java.lang.reflect.*; class Dog ( // methods of the class public void display() ( System.out.println("I am a dog."); ) private void makeSound() ( System.out.println("Bark Bark"); ) ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // using object of Class to // get all the declared methods of Dog Method() methods = obj.getDeclaredMethods(); // create an object of the Method class for (Method m : methods) ( // get names of methods System.out.println("Method Name: " + m.getName()); // get the access modifier of methods int modifier = m.getModifiers(); System.out.println("Modifier: " + Modifier.toString(modifier)); // get the return types of method System.out.println("Return Types: " + m.getReturnType()); System.out.println(" "); ) ) catch (Exception e) ( e.printStackTrace(); ) ) )
Salida
Nombre del método: display Modifier: public Tipos de valores devueltos: void Nombre del método: makeSound Modificador: private Tipos de valores devueltos: void
En el ejemplo anterior, estamos tratando de obtener información sobre los métodos presentes en la clase Dog. Como se mencionó anteriormente, primero hemos creado un objeto obj de Class
usar el getClass()
método.
Note la expresión,
Method() methods = obj.getDeclaredMethod();
Aquí, getDeclaredMethod()
devuelve todos los métodos presentes dentro de la clase.
Además, hemos creado un objeto m de la Method
clase. Aquí,
- m.getName () : devuelve el nombre de un método
- m.getModifiers () : devuelve el modificador de acceso de los métodos en forma de número entero
- m.getReturnType () : devuelve el tipo de retorno de métodos
La Method
clase también proporciona varios otros métodos que se pueden usar para inspeccionar métodos en tiempo de ejecución. Para obtener más información, visite la clase Método Java (documentación oficial de Java).
2. Reflexión de los campos de Java
Como los métodos, también podemos inspeccionar y modificar diferentes campos de una clase usando los métodos de la Field
clase. Por ejemplo,
import java.lang.Class; import java.lang.reflect.*; class Dog ( public String type; ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // access and set the type field Field field1 = obj.getField("type"); field1.set(d1, "labrador"); // get the value of the field type String typeValue = (String) field1.get(d1); System.out.println("Value: " + typeValue); // get the access modifier of the field type int mod = field1.getModifiers(); // convert the modifier to String form String modifier1 = Modifier.toString(mod); System.out.println("Modifier: " + modifier1); System.out.println(" "); ) catch (Exception e) ( e.printStackTrace(); ) ) )
Salida
Valor: labrador Modificador: público
En el ejemplo anterior, hemos creado una clase llamada Perro. Incluye un campo público denominado type. Note la declaración,
Field field1 = obj.getField("type");
Aquí, estamos accediendo al campo público de la clase Dog y asignándolo al objeto field1 de la clase Field.
Luego usamos varios métodos de la Field
clase:
- field1.set () : establece el valor del campo
- field1.get () : devuelve el valor del campo
- field1.getModifiers () : devuelve el valor del campo en forma de número entero
Del mismo modo, también podemos acceder y modificar campos privados. Sin embargo, el reflejo del campo privado es un poco diferente al del campo público. Por ejemplo,
import java.lang.Class; import java.lang.reflect.*; class Dog ( private String color; ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // access the private field color Field field1 = obj.getDeclaredField("color"); // allow modification of the private field field1.setAccessible(true); // set the value of color field1.set(d1, "brown"); // get the value of field color String colorValue = (String) field1.get(d1); System.out.println("Value: " + colorValue); // get the access modifier of color int mod2 = field1.getModifiers(); // convert the access modifier to string String modifier2 = Modifier.toString(mod2); System.out.println("Modifier: " + modifier2); ) catch (Exception e) ( e.printStackTrace(); ) ) )
Salida
Valor: marrón Modificador: privado
En el ejemplo anterior, hemos creado una clase llamada Perro. La clase contiene un campo privado llamado color. Note la declaración.
Field field1 = obj.getDeclaredField("color"); field1.setAccessible(true);
Aquí, estamos accediendo al color y asignándolo al objeto field1 de la Field
clase. Luego usamos field1 para modificar la accesibilidad del color y nos permite hacer cambios en él.
Luego usamos field1 para realizar varias operaciones en el color del campo privado.
Para obtener más información sobre los diferentes métodos de Field, visite Java Field Class (documentación oficial de Java).
3. Reflexión del constructor Java
También podemos inspeccionar diferentes constructores de una clase usando varios métodos proporcionados por la Constructor
clase. Por ejemplo,
import java.lang.Class; import java.lang.reflect.*; class Dog ( // public constructor without parameter public Dog() ( ) // private constructor with a single parameter private Dog(int age) ( ) ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // get all constructors of Dog Constructor() constructors = obj.getDeclaredConstructors(); for (Constructor c : constructors) ( // get the name of constructors System.out.println("Constructor Name: " + c.getName()); // get the access modifier of constructors // convert it into string form int modifier = c.getModifiers(); String mod = Modifier.toString(modifier); System.out.println("Modifier: " + mod); // get the number of parameters in constructors System.out.println("Parameters: " + c.getParameterCount()); System.out.println(""); ) ) catch (Exception e) ( e.printStackTrace(); ) ) )
Salida
Nombre del constructor: Perro Modificador: público Parámetros: 0 Nombre del constructor: Perro Modificador: privado Parámetros: 1
En el ejemplo anterior, hemos creado una clase llamada Perro. La clase incluye dos constructores.
Estamos usando la reflexión para encontrar la información sobre los constructores de la clase. Note la declaración,
Constructor() constructors = obj.getDeclaredConstructor();
Aquí, estamos accediendo a todos los constructores presentes en Dog y asignándolos a una matriz de constructores del Constructor
tipo.
Luego usamos el objeto c para obtener información diferente sobre el constructor.
- c.getName () : devuelve el nombre del constructor
- c.getModifiers () : devuelve los modificadores de acceso del constructor en forma de entero
- c.getParameterCount () : devuelve el número de parámetros presentes en cada constructor
Para conocer más métodos de la Constructor
clase, visite la clase Constructor