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

Tutorial da API Java Reflection com exemplo


O que é reflexão 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 classes e seus membros que incluem campos, métodos, construtores, 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 reflexão java.Methods da classe java.lang.Class é usado para reunir os metadados completos de uma determinada classe.

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 reflexão-

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

Como obter informações completas sobre uma turma

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


    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



    Exemplo 2:Como obter metadados de variável


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

    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 ​​na classe acima:
    1. Crie o objeto de classe da classe acima, ou seja, Guru99VariableMetaData.class como abaixo:
        Guru99VariableMetaData  guru99ClassVar  = new Guru99VariableMetaData();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
    2. Obtenha os metadados na forma de matriz de campo usando getFields() ou getDeclaredFields() métodos abaixo:
      Field[]  guru99Field1= guru99ClassObjVar .getFields();
      Field[]  guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    getCampos() 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 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 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. Recebi todos os metadados das variáveis ​​em uma matriz Field
      3. Impresso todos os nomes de variáveis ​​na classe Guru99VariableMetaData.class
      4. Impresso todos os tipos de dados das variáveis ​​na classe Guru99VariableMetaData.class
      5. Impresso todos os modificadores de acesso das variáveis ​​na classe Guru99VariableMetaData.class
      6. Valores impressos de todas as variáveis ​​em Imprimido 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 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 na 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 de método em uma matriz Method 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 Modifiers.toString(int i) métodos.
      6. Obtenha 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 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. Recebi 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 na classe Guru99MethodMetaData.class
      5. Impresso 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 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. Recebi todos os metadados de todos os construtores em uma matriz Constructor
      3. Impresso todos os nomes do construtor presentes na classe Guru99Constructor.class
      4. Impresso 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 classe, como variáveis, métodos, 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 e variáveis ​​particulares 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 problemas de permissão. Portanto, a API de reflexão deve ser tratada como o último recurso para realizar uma operação.

    Java

    1. Classe anônima Java
    2. Reflexão Java
    3. Classe Java ObjectInputStream
    4. Classe Java ObjectOutputStream
    5. Classe e objeto C++ com exemplo
    6. Tutorial de classe abstrata C# com exemplo:O que é abstração?
    7. Método Java String charAt() com exemplo
    8. Java String EndsWith() Método com Exemplo
    9. Java BufferedReader:Como Ler Arquivo em Java com Exemplo
    10. Algoritmo de ordenação por inserção em Java com exemplo de programa