Tutorial da Java Reflection API com exemplo

O que é o Reflection em Java?

Java Reflection é o processo de análise e modificação de todos os recursos de uma classe em tempo de execução. A API de reflexão em Java é usada para manipular a classe e seus membros, que incluem campos, métodos, construtor, etc. em tempo de execução.

Uma vantagem da API de reflexão em Java é que ela também pode manipular membros privados da classe.

O pacote java.lang.reflect fornece muitas classes para implementar a reflexão java.Methods da classe java.lang.Class é usado para reunir os metadados completos de uma classe específica.

Neste tutorial, você aprenderá-

Classe no pacote java.lang.reflect

A seguir está uma lista de várias classes Java em java.lang.package para implementar a reflexão

  • Campo : Esta classe é usada para reunir informações declarativas, como tipo de dados, modificador de acesso, nome e valor de uma variável.
  • Método : Esta classe é usada para coletar informações declarativas, como modificador de acesso, tipo de retorno, nome, tipos de parâmetro e tipo de exceção de um método.
  • Construtor : Esta classe é usada para coletar informações declarativas, como modificador de acesso, nome e tipos de parâmetro de um construtor.
  • Para modificar : Esta classe é usada para reunir informações sobre um modificador de acesso específico.

Métodos usados ​​em java.lang.Class

  • Public String getName () : Retorna o nome da classe.
  • public Class getSuperclass () : Retorna a referência da superclasse
  • Public Class [] getInterfaces () : Retorna uma matriz de interfaces implementadas pela classe especificada
  • Público em getModifiers (): Retorna um valor inteiro que representa os modificadores da classe especificada que precisa ser passado como um parâmetro para ' public static String toString (int i) ' método que retorna o especificador de acesso para a classe fornecida.

Como obter informações completas sobre uma aula

Para obter informações sobre variáveis, métodos e construtores de uma classe, precisamos criar um objeto da classe.

 public class Guru99ClassObjectCreation { public static void main (String[] args) throws ClassNotFoundException { //1 - By using Class.forname() method Class c1 = Class.forName('Guru99ClassObjectCreation'); //2- By using getClass() method Guru99ClassObjectCreation on2vhfObj = new Guru99ClassObjectCreation(); Class c2 = on2vhfObj.getClass(); //3- By using .class Class c3= Guru99ClassObjectCreation.class; } } 
  • O exemplo a seguir mostra diferentes maneiras de criar um objeto da classe 'class':
  • Exemplo 1: como obter metadados de classe

    O exemplo a seguir mostra como obter metadados como: nome da classe, nome da superclasse, interfaces implementadas e modificadores de acesso de uma classe.

    Obteremos os metadados da classe abaixo chamada Guru99Base.class:

     import java.io.Serializable; public abstract class Guru99Base implements Serializable,Cloneable { } 
    1. O nome da classe é: Guru99Base
    2. Seus modificadores de acesso são: público e abstrato
    3. Ele implementou interfaces: Serializable e Cloneable
    4. Como não estendeu nenhuma classe explicitamente, sua superclasse é: java.lang.Object
    A classe abaixo obterá os metadados de Guru99Base.class e os imprimirá:

     import java.lang.reflect.Modifier; public class Guru99GetclassMetaData { public static void main (String [] args) throws ClassNotFoundException { // Create Class object for Guru99Base.class Class on2vhfClassObj = Guru99Base.class; // Print name of the class system.out.println('Name of the class is : ' +on2vhfClassObj.getName()); // Print Super class name system.out.println('Name of the super class is : ' +on2vhfClassObj.getSuperclass().getName()); // Get the list of implemented interfaces in the form of Class array using getInterface() method class[] on2vhfInterfaceList = on2vhfclassObj.getInterfaces(); // Print the implemented interfaces using foreach loop system.out.print('Implemented interfaces are : '); for (Class on2vhfclass1 : quru99 InterfaceList) { system.out.print on2vhfclass1.getName() + ' '); } system.out.println(); //Get access modifiers using get Modifiers() method and toString() method of java.lang.reflect.Modifier class int on2vhfAccessModifier= on2vhfclassObj.getModifiers(); // Print the access modifiers System.Out.println('Access modifiers of the class are : ' +Modifier.tostring(on2vhfAccessModifier)); } } 
    1. imprime o nome da classe usando o método getName
    2. Imprima o nome da superclasse usando o método getSuperClass (). GetName ()
    3. Imprime o nome das interfaces implementadas
    4. Imprime os modificadores de acesso usados ​​pela classe

    Exemplo 2: Como obter metadados de variáveis

    Os exemplos a seguir mostram como obter metadados de variáveis:

    Aqui, estamos criando uma classe chamada Guru99VariableMetaData .class com algumas variáveis:

     package guru; public class Guru99VariableMetaData { public static int on2vhfIntVar1=1111; static int on2vhfIntVar2=2222; static String on2vhfStringVar1='on2vhf.be'; static String on2vhfStringVar2='Learning Reflection API'; } 
    Etapas para obter os metadados sobre as variáveis ​​na classe acima:
    1. Crie o objeto de classe da classe acima, ou seja, Guru99VariableMetaData.class como abaixo:
       Guru99VariableMetaData on2vhfClassVar = new Guru99VariableMetaData(); Class on2vhfClassObjVar = on2vhfClassVar.getClass();
    2. Obtenha os metadados na forma de array de campo usando getFields () ou getDeclaredFields () métodos como abaixo:
      Field[] on2vhfField1= on2vhfClassObjVar .getFields(); Field[] on2vhfFiel2= on2vhfClassObjVar .getDeclaredFields();

    getFields () método retorna metadados da variável pública da classe especificada, bem como de sua superclasse.

    getDeclaredFields () método retorna metadados de todas as variáveis ​​da classe especificada apenas.

    1. Obtenha o nome das variáveis ​​usando o método 'public String getName ()'.
    2. Obtenha o tipo de dados das variáveis ​​usando o método 'public Class getType ()'.
    3. Obtenha o valor da variável usando o método 'public xxx get (Field)'.

      Aqui, xxx pode ser um byte ou abreviação de qualquer tipo de valor que desejamos buscar.

    4. Obtenha os modificadores de acesso das variáveis ​​usando os métodos getModifier () e Modifier.toString (int i).

      Aqui, estamos escrevendo uma classe para obter os metadados das variáveis ​​presentes na classe Guru99VariableMetaData .class:

       package guru; import java.lang.reflect.Field; public class Guru99VariableMetaDataTest { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { // Create Class object for Guru99VariableMetaData.class Guru99VariableMetaData on2vhfClassVar = new Guru99VariableMetaData(); Class on2vhfClassObjVar = on2vhfClassVar.getClass(); // Get the metadata of all the fields of the class Guru99VariableMetaData Field[] on2vhfField1= on2vhfClassObjVar.getDeclaredFields(); // Print name, datatypes, access modifiers and values of the varibales of the specified class for(Field field : on2vhfField1) { System.out.println('Variable name : '+field.getName()); System.out.println('Datatypes of the variable :'+field.getType()); int on2vhfAccessModifiers = field.getModifiers(); System.out.printlln('Access Modifiers of the variable : '+Modifier.toString(on2vhfAccessModifiers)); System.out.println('Value of the variable : '+field.get(on2vhfClassVar)); System.out.println(); system.out.println('* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *') ; } } } 
      1. Objeto de classe criado para Guru99VariableMetaData.class
      2. Obteve todos os metadados das variáveis ​​em uma matriz de campo
      3. Impresso todos os nomes de variáveis ​​na classe Guru99VariableMetaData.class
      4. Imprimiu todos os tipos de dados das variáveis ​​na classe Guru99VariableMetaData.class
      5. Imprimiu todos os modificadores de acesso das variáveis ​​na classe Guru99VariableMetaData.class
      6. Valores impressos de todas as variáveis ​​em Impressos todos os tipos de dados das variáveis ​​na classe Guru99VariableMetaData.class

      Exemplo 3: Como obter metadados do método

      Os exemplos a seguir mostram como obter metadados de um método:

      Aqui, estamos criando uma classe chamada Guru99MethodMetaData .class com alguns métodos

       package guru; import java.sql.SQLException; public class Guru99MethodMetaData { public void on2vhfAdd(int firstElement, int secondElement , String result) throws ClassNotFoundException, ClassCastException{ System.out.println('Demo method for Reflextion API'); } public String on2vhfSearch(String searchString) throws ArithmeticException, InterruptedException{ System.out.println('Demo method for Reflection API'); return null; } public void on2vhfDelete(String deleteString) throws SQLException{ System.out.println('Demo method for Reflection API'); } } 

      Etapas para obter os metadados sobre os métodos da classe acima:

      1. Crie o objeto de classe da classe acima, ou seja, Guru99MethodMetaData.class como abaixo:
         Guru99MethodMetaData on2vhfClassVar = new Guru99MethodMetaData (); Class on2vhfClassObjVar = on2vhfClassVar.getClass();
      2. Obtenha informações de método em uma matriz de Método usando os métodos getMethods () e getDeclaredMethods () conforme abaixo:
         Method[] on2vhf Method 1= on2vhfClassObjVar .get Methods(); Method [] on2vhf Method 2= on2vhfClassObjVar .getDeclared Method s();

        getMethods () método retorna metadados dos métodos públicos da classe especificada, bem como de sua superclasse.

        getDeclaredMethods () método retorna metadados de todos os métodos da classe especificada apenas.

      3. Pegue o nome do método usando getName () método.
      4. Obtenha o tipo de retorno do método usando getReturnType () método.
      5. Obtenha modificadores de acesso dos métodos usando getModifiers () e Modifiers.toString (int i) métodos.
      6. Obter tipos de parâmetro de método usando getParameterTypes () método que retorna uma matriz de classe.
      7. Obter exceção lançada usando getExceptionTypes () método que retorna uma matriz de classe.

      Aqui, estamos escrevendo uma classe para obter os metadados dos métodos presentes na classe Guru99MethodMetaData.class:

       package guru; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class Guru99MethodMetaDataTest { public static void main (String[] args) { // Create Class object for Guru99Method MetaData.class class on2vhfClassObj = Guru99MethodMetaData.class; // Get the metadata or information of all the methods of the class using getDeclaredMethods() Method[] on2vhfMethods=on2vhfclassObj.getDeclaredMethods(); for(Method method : on2vhfMethods) { // Print the method names System.out.println('Name of the method : '+method.getName()); // Print return type of the methods System.out.println('Return type of the method : '+method.getReturnType()); //Get the access modifier list and print int on2vhfModifierList = method.getModifiers(); System.Out.printlin ('Method access modifiers : '+Modifier.toString(on2vhfModifierList)); // Get and print parameters of the methods Class[] on2vhfParamList= method.getParameterTypes(); system.out.print ('Method parameter types : '); for (Class class1 : on2vhfParamList){ System.out.println(class1.getName()+' '); } System.out.println(); // Get and print exception thrown by the method Class[] on2vhfExceptionList = method. getExceptionTypes(); system.out.print('Excpetion thrown by method :'); for (Class class1 : on2vhfExceptionList) { System.out.println (class1.getName() +' '): } System.Out.println(); system.out.println('* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '); } } } 
      1. Objeto de classe criado para Guru99MethodMetaData.class
      2. Obteve todos os metadados de todos os métodos em uma matriz de Método
      3. Impresso todos os nomes de métodos presentes na classe Guru99MethodMetaData.class
      4. Tipos de retorno impressos dos métodos na classe Guru99MethodMetaData.class
      5. Imprimiu todos os modificadores de acesso dos métodos na classe Guru99MethodMetaData.class
      6. Tipos de parâmetros impressos dos métodos em Guru99MethodMetaData.class
      7. Exceções impressas são lançadas por métodos em Guru99MethodMetaData.class

      Exemplo 4: Como obter metadados de construtores

      Os exemplos a seguir mostram como obter metadados de construtores:

      Aqui, estamos criando uma classe chamada Guru99Constructor.class com diferentes construtores:

       package guru; import java.rmi.RemoteException; import java.sql.SQLException; public class Guru99Constructor { public Guru99Constructor(int no) throws ClassCastException ,ArithmeticException{ } public Guru99Constructor(int no, String name) throws RemoteException ,SQLException{ } public Guru99Constructor(int no, String name, String address)  throws  InterruptedException{ } }

      Aqui, estamos escrevendo uma classe para obter os metadados dos construtores presentes na classe Guru99Constructor.class:

       package guru; import java.lang.reflect.Constructor; public class Guru99ConstructorMetaDataTest { public static void main (String[] args) { // Create Class object for Guru99Constructor.class Class on2vhfClass=Guru99Constructor.class; // Get all the constructor information in the Constructor array Constructor[] on2vhfConstructorList = on2vhfClass.getConstructors(); for (Constructor constructor : on2vhfConstructorList) { // Print all name of each constructor System.out.println('Constrcutor name : '+constructor.getName()); //Get and print access modifiers of each constructor int on2vhfModifiers= constructor.getModifiers(); System.Out.printlin ('Constrctor modifier : '+Modifier.toString(on2vhfModifiers)); // Get and print parameter types Class[] on2vhfParamList=constructor.getParameterTypes(); System.out.print ('Constrctor parameter types :'); for (Class class1 : on2vhfParamList) { System.out.println(class1.getName() +' '); } System. out.println(); // Get and print exception thrown by constructors Class[] on2vhfExceptionList=constructor.getFxceptionTypes(); System.out.println('Exception thrown by constructors :'); for (Class class1 : on2vhfExceptionList) { System.out.println(class1.getName() +' '); } System.out.println(); System.out.println('*******************************************'); } } } 
      1. Objeto de classe criado para Guru99Constructor.class
      2. Obteve todos os metadados de todos os construtores em uma matriz de construtor
      3. Foram impressos todos os nomes do construtor presentes na classe Guru99Constructor.class
      4. Foram impressos todos os modificadores de acesso dos construtores na classe Guru99Constructor.class
      5. Tipos de parâmetros impressos dos construtores em Guru99Constructor.class
      6. Exceções impressas são lançadas por construtores em Guru99Constructor.class

      Resumo:

      • A programação de reflexão em java ajuda a recuperar e modificar informações sobre classes e membros de classes, tais como variáveis, métodos e construtores.
      • A API de reflexão em Java pode ser implementada usando classes no pacote java.lang.reflect e métodos da classe java.lang.Class.
      • Alguns métodos comumente usados ​​da classe java.lang.Class são getName (), getSuperclass (), getInterfaces (), getModifiers () etc.
      • Algumas classes comumente usadas no pacote java.lang.reflect são Field, Method, Constructor, Modifier, etc.
      • A API de reflexão pode acessar métodos privados e variáveis ​​de uma classe que pode ser uma ameaça à segurança.
      • A API de reflexão é um recurso poderoso fornecido pelo Java, mas vem com algumas sobrecargas, como desempenho mais lento, vulnerabilidade de segurança e problema de permissão. Portanto, a API de reflexão deve ser tratada como o último recurso para executar uma operação.