Java Tutorial da API Reflection com exemplo

O que é reflexão Java?

Java Reflexão é o processo de analisar e modificar todos os recursos de uma classe em tempo de execução. API de reflexão em Java é usado para manipular classes e seus membros que incluem campos, métodos, construtor, etc. em tempo de execução.

Uma vantagem da API de reflexão em Java isto é, ele 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.

Classe no pacote java.lang.reflect

Segue uma lista de vário Java aulas em java.lang.package para implementar reflexão-

  • Campo: Esta classe é usada para coletar informações declarativas como tipo de dados, modificador de acesso, nome e valor de uma variável.
  • Forma: Esta classe é usada para coletar informações declarativas como modificador de acesso, tipo de retorno, nome, tipos de parâmetros 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âmetros de um construtor.
  • Modificar: esta classe é usada para coletar informações sobre um modificador de acesso específico.

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

  • String pública getNome(): Retorna o nome da classe.
  • Classe pública getSuperclass(): Retorna a referência da superclasse
  • Classe pública[] getInterfaces() : Retorna um array de interfaces implementadas pela classe especificada
  • Público em getModifiers(): Retorna um valor inteiro representando os modificadores da classe especificada que precisa ser passado como parâmetro para “String estática pública paraString (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.

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

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 guru99Obj = new Guru99ClassObjectCreation();
		Class c2 = guru99Obj.getClass();
		//3- By using .class 
		Class c3= Guru99ClassObjectCreation.class;
		}
	}
  • O exemplo a seguir mostra diferentes maneiras de criar o 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:

    Obtenha metadados da classe

    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. Possui interfaces implementadas: 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á:

    Obtenha metadados da classe

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

    Obtenha metadados da classe

    Obtenha metadados da classe

    Exemplo 2: Como obter metadados de variável

    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 guru99IntVar1=1111;
                   static int guru99IntVar2=2222;							
                   static String guru99StringVar1="guru99.com";							
                    static String guru99StringVar2="Learning Reflection API";    
    }	
    
    Etapas para obter os metadados sobre as variáveis ​​da classe acima:
    1. Crie o objeto de classe da classe acima, ou seja, Guru99VariableMetaData.class conforme abaixo:
        Guru99VariableMetaData  guru99ClassVar  = new Guru99VariableMetaData();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
    2. Obtenha os metadados na forma de array de campos usando getFields() or getDeclaredFields () métodos como abaixo:
      Field[]  guru99Field1= guru99ClassObjVar .getFields();
      Field[]  guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

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

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

    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 menos 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:

      Obtenha metadados de variável

      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 guru99ClassVar = new Guru99VariableMetaData(); 
      	Class guru99ClassObjVar = guru99ClassVar.getClass();
      	
      	// Get the metadata of all the fields of the class Guru99VariableMetaData 
      	Field[] guru99Field1= guru99ClassObjVar.getDeclaredFields();
      	
      	// Print name, datatypes, access modifiers and values of the varibales of the specified class 
      	for(Field field : guru99Field1) { 
      	System.out.println("Variable name : "+field.getName());
      	System.out.println("Datatypes of the variable :"+field.getType());
      	
      	int guru99AccessModifiers = field.getModifiers();
      	System.out.printlln("Access Modifiers of the variable : "+Modifier.toString(guru99AccessModifiers));
      	System.out.println("Value of the variable : "+field.get(guru99ClassVar));
      	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 Field
      3. Imprimiu 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 ​​da 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

      Obtenha metadados do método

      Obtenha metadados do método

      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

      Obtenha metadados do método

      package guru;		
      import java.sql.SQLException;		
      public class Guru99MethodMetaData {   				
      
      	public void guru99Add(int firstElement, int secondElement , String result) 									
          throws ClassNotFoundException, ClassCastException{			
                System.out.println("Demo method for Reflextion  API");					
          }	
          public String guru99Search(String searchString) 			
          throws ArithmeticException, InterruptedException{			
              System.out.println("Demo method for Reflection API");					
      		return null;					
          }	
      	public void guru99Delete(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 conforme abaixo:
        Guru99MethodMetaData  guru99ClassVar  = new Guru99MethodMetaData  ();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
      2. Obtenha informações do método em uma matriz de método usando os métodos getMethods() e getDeclaredMethods() conforme abaixo:
        Method[]  guru99 Method 1= guru99ClassObjVar .get Methods();
        Method []  guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

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

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

      3. Obtenha 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 Modificadores.toString(int i) métodos.
      6. Obtenha tipos de parâmetros de método usando getParameterTypes() método que retorna um array de classe.
      7. Obtenha uma exceção lançada usando getExceptionTypes() método que retorna um array de classe.

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

      Obtenha metadados do método

      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 guru99ClassObj = Guru99MethodMetaData.class;
      
      		// Get the metadata or information of all the methods of the class using getDeclaredMethods() 
      		Method[] guru99Methods=guru99classObj.getDeclaredMethods();
      
      		for(Method method : guru99Methods) { 
      		// 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 guru99ModifierList = method.getModifiers(); 
      		System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList));
      		
      		// Get and print parameters of the methods 
      		Class[] guru99ParamList= method.getParameterTypes(); 
      		system.out.print ("Method parameter types : "); 
      		for (Class class1 : guru99ParamList){ 
      			System.out.println(class1.getName()+" ");
      		}
              System.out.println();
      		
      		// Get and print exception thrown by the method 
      		Class[] guru99ExceptionList = method. getExceptionTypes(); 
      		system.out.print("Excpetion thrown by method :"); 
      		for (Class class1 : guru99ExceptionList) {
      			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étodos
      3. Impresso todos os nomes de métodos presentes na classe Guru99MethodMetaData.class
      4. Tipos de retorno impressos dos métodos da classe Guru99MethodMetaData.class
      5. Imprimiu todos os modificadores de acesso dos métodos da 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

        Obtenha metadados do método

      Obtenha metadados do método

      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:

      Obtenha metadados de 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:

      Obtenha metadados de construtores

      package guru;
      import java.lang.reflect.Constructor; 
      public class Guru99ConstructorMetaDataTest {
      	
      	public static void main (String[] args) {
      		// Create Class object for Guru99Constructor.class 
      		Class guru99Class=Guru99Constructor.class;
      
      		// Get all the constructor information in the Constructor array
      		Constructor[] guru99ConstructorList = guru99Class.getConstructors();
      		
      		for (Constructor constructor : guru99ConstructorList) {
      			// Print all name of each constructor
      			System.out.println("Constrcutor name : "+constructor.getName());
      			
      			//Get and print access modifiers of each constructor 
      			int guru99Modifiers= constructor.getModifiers(); 
      			System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers));
      			
      			// Get and print parameter types 
      			Class[] guru99ParamList=constructor.getParameterTypes();
      			System.out.print ("Constrctor parameter types :"); 
      			for (Class class1 : guru99ParamList) { 
      				System.out.println(class1.getName() +" ");
      			}
      			System. out.println();
      
      			// Get and print exception thrown by constructors
      			Class[] guru99ExceptionList=constructor.getFxceptionTypes();
      			System.out.println("Exception thrown by constructors :"); 
      			for (Class class1 : guru99ExceptionList) { 
      				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 construtores
      3. Imprimiu todos os nomes dos construtores presentes na classe Guru99Constructor.class
      4. Imprimiu 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

      Obtenha metadados de construtores

      Obtenha metadados de construtores

      Resumo

      • A programação de reflexão em java ajuda a recuperar e modificar informações sobre classes e membros de classes, como variáveis, métodos e construtores.
      • API de reflexão em Java pode ser implementado 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 Campo, Método, Construtor, Modificador, etc.
      • A API Reflection pode acessar métodos e variáveis ​​privadas de uma classe que pode ser uma ameaça à segurança.
      • A API Reflection é um recurso poderoso fornecido por 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.