Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Java

Reflexión Java

Reflexión Java

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 guarda toda la información sobre objetos y clases en tiempo de ejecución. El objeto de Clase se puede utilizar para realizar la reflexión.


Reflejo de las clases de Java

Para reflejar una clase de Java, primero debemos crear un objeto de Class .

Y, al usar 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() El método toma el nombre de la clase a reflejar como su 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 del Perro class 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 del 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

Name: Dog
Modifier: public
Superclass: Animal

En el ejemplo anterior, hemos creado una superclase:Animal y una subclase:Perro . Aquí, estamos tratando de inspeccionar la clase Dog .

Note la declaración,

Class obj = d1.getClass();

Aquí, estamos creando un objeto obj de Clase usando el getClass() método. Usando el objeto, estamos llamando a diferentes métodos de Class .

Para obtener más información sobre Class , visite Java Class (documentación oficial de Java).

Nota :Estamos usando el Modifier class para convertir el modificador de acceso entero a una cadena.


Reflejo de campos, métodos y constructores

El paquete java.lang.reflect proporciona clases que se pueden usar para manipular miembros de clase. Por ejemplo,


1. Reflexión de los métodos de Java

El Method class proporciona varios métodos que se pueden usar 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

Method Name: display
Modifier: public
Return Types: void
 
Method Name: makeSound
Modifier: private
Return Types: void

En el ejemplo anterior, estamos tratando de obtener información sobre los métodos presentes en Dog clase. Como se mencionó anteriormente, primero hemos creado un objeto obj de Class usando el getClass() método.

Observe la expresión,

Method[] methods = obj.getDeclaredMethod();

Aquí, el getDeclaredMethod() devuelve todos los métodos presentes dentro de la clase.

Además, hemos creado un objeto m del Method clase. Aquí,

El Method La 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 Java Method (documentación oficial de Java).


2. Reflejo de Campos Java

Al igual que los métodos, también podemos inspeccionar y modificar diferentes campos de una clase usando los métodos del 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

Value: labrador
Modifier: public

En el ejemplo anterior, hemos creado una clase llamada Perro . Incluye un campo público llamado tipo . Note la declaración,

Field field1 = obj.getField("type");

Aquí, estamos accediendo al campo público del Perro class y asignándolo al objeto field1 del Campo clase.

Luego usamos varios métodos del Field clase:

Del mismo modo, también podemos acceder y modificar campos privados. Sin embargo, el reflejo del campo privado es un poco diferente al 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

Value: brown
Modifier: private

En el ejemplo anterior, hemos creado una clase llamada Perro . La clase contiene un campo privado llamado color . Fíjate en la declaración.

Field field1 = obj.getDeclaredField("color");

field1.setAccessible(true);

Aquí, estamos accediendo a color y asignándolo al objeto field1 del Field clase. Luego usamos field1 para modificar la accesibilidad de color y nos permite realizar 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. Reflejo de Java Constructor

También podemos inspeccionar diferentes constructores de una clase utilizando varios métodos proporcionados por 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

Constructor Name: Dog
Modifier: public     
Parameters: 0        

Constructor Name: Dog
Modifier: private    
Parameters: 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 constructores del Constructor tipo.

Luego usamos el objeto c para obtener diferentes informaciones sobre el constructor.

Para conocer más métodos del Constructor clase, visita la clase Constructor


Java

  1. Palabra clave final de Java
  2. Operador de instancia de Java
  3. Herencia de Java
  4. Clase estática anidada de Java
  5. Clase anónima de Java
  6. Clase única de Java
  7. Clase Java ArrayList
  8. Clase de pila de Java
  9. Clase Java ObjectOutputStream
  10. Genéricos de Java
  11. Clase de archivo Java