Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Java

Reflexão Java

Reflexão Java


Neste tutorial, aprenderemos a reflexão, um recurso da programação Java que nos permite inspecionar e modificar classes, métodos, etc.

Em Java, a reflexão nos permite inspecionar e manipular classes, interfaces, construtores, métodos e campos em tempo de execução.

Existe uma classe em Java chamada Class que mantém todas as informações sobre objetos e classes em tempo de execução. O objeto de Class pode ser usado para realizar a reflexão.


Reflexão das classes Java


Para refletir uma classe Java, primeiro precisamos criar um objeto de Class .

E, usando o objeto, podemos chamar vários métodos para obter informações sobre métodos, campos e construtores presentes em uma classe.

Existem três maneiras de criar objetos de Classe:

1. Usando o método forName()
class Dog {...}

// create object of Class
// to reflect the Dog class
Class a = Class.forName("Dog");

Aqui, o forName() O método leva o nome da classe a ser refletida como seu argumento.

2. Usando o 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();

Aqui, estamos usando o objeto do Dog class para criar um objeto de Class .

3. Usando a extensão .class
// create an object of Class
// to reflect the Dog class
Class c = Dog.class;

Agora que sabemos como podemos criar objetos do Class . Podemos usar este objeto para obter informações sobre a classe correspondente em tempo de execução.

Exemplo:Reflexão de classe 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();
    }
  }
}

Saída
Name: Dog
Modifier: public
Superclass: Animal

No exemplo acima, criamos uma superclasse:Animal e uma subclasse:Cão . Aqui, estamos tentando inspecionar a classe Cachorro .

Observe a afirmação,
Class obj = d1.getClass();

Aqui, estamos criando um objeto obj de Classe usando o getClass() método. Usando o objeto, estamos chamando diferentes métodos de Class .

Para saber mais sobre Class , visite Java Class (documentação oficial do Java).

Observação :Estamos usando o Modifier class para converter o modificador de acesso inteiro em uma string.

Refletores de Campos, Métodos e Construtores


O pacote java.lang.reflect fornece classes que podem ser usadas para manipular membros de classe. Por exemplo,

1. Reflexão de métodos Java


O Method class fornece vários métodos que podem ser usados ​​para obter informações sobre os métodos presentes em uma classe. Por exemplo,
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();
    }
  }
}

Saída
Method Name: display
Modifier: public
Return Types: void
 
Method Name: makeSound
Modifier: private
Return Types: void

No exemplo acima, estamos tentando obter informações sobre os métodos presentes no Dog classe. Como mencionado anteriormente, primeiro criamos um objeto obj de Class usando o getClass() método.

Observe a expressão,
Method[] methods = obj.getDeclaredMethod();

Aqui, o getDeclaredMethod() retorna todos os métodos presentes dentro da classe.



Além disso, criamos um objeto m do Method classe. Aqui,

O Method A classe também fornece vários outros métodos que podem ser usados ​​para inspecionar métodos em tempo de execução. Para saber mais, visite a classe Java Method (documentação oficial do Java).

2. Reflexão de campos Java


Assim como os métodos, também podemos inspecionar e modificar diferentes campos de uma classe usando os métodos do Field classe. Por exemplo,
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();
    }
  }
}

Saída
Value: labrador
Modifier: public

No exemplo acima, criamos uma classe chamada Dog . Inclui um campo público chamado type . Observe a afirmação,
Field field1 = obj.getField("type");

Aqui, estamos acessando o campo public do Dog class e atribuindo-a ao objeto field1 do Campo classe.

Em seguida, usamos vários métodos do Field classe:

Da mesma forma, também podemos acessar e modificar campos privados. No entanto, o reflexo do campo privado é um pouco diferente do campo público. Por exemplo,
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();
    }
  }
}

Saída
Value: brown
Modifier: private

No exemplo acima, criamos uma classe chamada Dog . A classe contém um campo privado chamado color . Observe a declaração.
Field field1 = obj.getDeclaredField("color");

field1.setAccessible(true);

Aqui, estamos acessando color e atribuindo-o ao objeto field1 do Field classe. Em seguida, usamos field1 para modificar a acessibilidade de color e nos permite fazer alterações nele.

Em seguida, usamos field1 para realizar várias operações na cor do campo privado.

Para saber mais sobre os diferentes métodos de Field , visite Java Field Class (documentação oficial do Java).

3. Reflexo do Construtor Java


Também podemos inspecionar diferentes construtores de uma classe usando vários métodos fornecidos pelo Constructor classe. Por exemplo,
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();
    }
  }
}

Saída
Constructor Name: Dog
Modifier: public     
Parameters: 0        

Constructor Name: Dog
Modifier: private    
Parameters: 1

No exemplo acima, criamos uma classe chamada Dog . A classe inclui dois construtores.

Estamos usando reflexão para encontrar as informações sobre os construtores da classe. Observe a afirmação,
Constructor[] constructors = obj.getDeclaredConstructor();

Aqui, estamos acessando todos os construtores presentes em Dog e atribuindo-os a um array construtores dos Constructor modelo.

Em seguida, usamos o objeto c para obter informações diferentes sobre o construtor.

Para saber mais sobre métodos do Constructor class, visite a classe Construtor

Java

  1. Palavra-chave final Java
  2. Java instanceof Operator
  3. Herança Java
  4. Classe estática aninhada em Java
  5. Classe anônima Java
  6. Classe Java Singleton
  7. Classe Java ArrayList
  8. Classe Java ObjectOutputStream
  9. Genéricos Java
  10. Classe de arquivo Java