Java Tutorial Reflection API cu exemplu

รŽn ce este Reflecศ›ia Java?

Java Reflecศ›ia este procesul de analizฤƒ ศ™i modificare a tuturor capabilitฤƒศ›ilor unei clase รฎn timpul execuศ›iei. Reflection API รฎn Java este folosit pentru a manipula clasa ศ™i membrii acesteia, care includ cรขmpuri, metode, constructor etc. รฎn timpul execuศ›iei.

Un avantaj al reflection API รฎn Java adicฤƒ poate manipula ศ™i membrii privaศ›i ai clasei.

Pachetul java.lang.reflect oferฤƒ multe clase pentru a implementa reflectarea java.Metodele clasei java.lang.Class sunt folosite pentru a aduna metadatele complete ale unei anumite clase.

Clasฤƒ รฎn pachetul java.lang.reflect

รŽn continuare este o listฤƒ de diverse Java clase รฎn java.lang.package pentru a implementa reflection-

  • Cรขmp: Aceastฤƒ clasฤƒ este folositฤƒ pentru a colecta informaศ›ii declarative, cum ar fi tipul de date, modificatorul de acces, numele ศ™i valoarea unei variabile.
  • Metodฤƒ: Aceastฤƒ clasฤƒ este folositฤƒ pentru a aduna informaศ›ii declarative, cum ar fi modificatorul de acces, tipul de returnare, numele, tipurile de parametri ศ™i tipul de excepศ›ie al unei metode.
  • Constructor: Aceastฤƒ clasฤƒ este folositฤƒ pentru a aduna informaศ›ii declarative, cum ar fi modificatorul de acces, tipurile de nume ศ™i parametri ale unui constructor.
  • Modificatorul: Aceastฤƒ clasฤƒ este folositฤƒ pentru a aduna informaศ›ii despre un anumit modificator de acces.

Metode utilizate รฎn java.lang.Class

  • ศ™ir public getName (): Returneazฤƒ numele clasei.
  • clasฤƒ publicฤƒ getSuperclass(): Returneazฤƒ referinศ›a super-clasฤƒ
  • Clasa publicฤƒ[] getInterfaces() : Returneazฤƒ o serie de interfeศ›e implementate de clasa specificatฤƒ
  • Public รฎn getModifiers (): Returneazฤƒ o valoare รฎntreagฤƒ reprezentรขnd modificatorii clasei specificate care trebuie sฤƒ fie transmisฤƒ ca parametru la โ€žpublic static String toString (int i )โ€ metoda care returneazฤƒ specificatorul de acces pentru clasa datฤƒ.

Cum sฤƒ obศ›ineศ›i informaศ›ii complete despre o clasฤƒ

Pentru a obศ›ine informaศ›ii despre variabile, metode ศ™i constructori ai unei clase, trebuie sฤƒ creฤƒm un obiect al clasei.

Metode utilizate รฎn 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;
		}
	}
  • Urmฤƒtorul exemplu aratฤƒ diferite moduri de a crea obiectul clasei โ€žclasaโ€:
  • Exemplul 1: Cum sฤƒ obศ›ineศ›i metadatele clasei

    Urmฤƒtorul exemplu aratฤƒ cum sฤƒ obศ›ineศ›i metadate, cum ar fi: numele clasei, numele superclasei, interfeศ›ele implementate ศ™i modificatorii de acces ai unei clase.

    Vom obศ›ine metadatele clasei de mai jos numite Guru99Base.class:

    Obศ›ineศ›i metadatele clasei

    import java.io.Serializable;
    public abstract class Guru99Base implements Serializable,Cloneable {
    }
    
    1. Numele clasei este: Guru99Base
    2. Modificatorii de acces sunt: โ€‹โ€‹public ศ™i abstract
    3. Are interfeศ›e implementate: Serializabil ศ™i Clonabil
    4. Deoarece nu a extins nicio clasฤƒ รฎn mod explicit, super-clasa este: java.lang.Object

    Clasa de mai jos va obศ›ine metadatele Guru99Base.class ศ™i le va imprima:

    Obศ›ineศ›i metadatele clasei

    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. tipฤƒriศ›i numele clasei folosind metoda getName
    2. Tipฤƒriศ›i numele superclasei folosind metoda getSuperClass().getName().
    3. Tipฤƒriศ›i numele interfeศ›elor implementate
    4. Tipฤƒriศ›i modificatorii de acces folosiศ›i de clasฤƒ

    Obศ›ineศ›i metadatele clasei

    Obศ›ineศ›i metadatele clasei

    Exemplul 2: Cum sฤƒ obศ›ineศ›i metadatele variabilei

    Urmฤƒtoarele exemple aratฤƒ cum sฤƒ obศ›ineศ›i metadatele variabilei:

    Aici, creฤƒm o clasฤƒ numitฤƒ Guru99VariableMetaData .class cu cรขteva variabile:

    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";    
    }	
    
    Paศ™i pentru a obศ›ine metadatele despre variabilele din clasa de mai sus:
    1. Creaศ›i obiectul clasei din clasa de mai sus, adicฤƒ Guru99VariableMetaData.class ca mai jos:
        Guru99VariableMetaData  guru99ClassVar  = new Guru99VariableMetaData();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
    2. Obศ›ineศ›i metadatele sub formฤƒ de matrice de cรขmp folosind getFields() or getDeclaredFields() metode dupฤƒ cum urmeazฤƒ:
      Field[]  guru99Field1= guru99ClassObjVar .getFields();
      Field[]  guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    getFields() metoda returneazฤƒ metadatele variabilei publice din clasa specificatฤƒ, precum ศ™i din superclasa acesteia.

    getDeclaredFields() metoda returneazฤƒ metadatele tuturor variabilelor din clasa specificatฤƒ.

    1. Obศ›ineศ›i numele variabilelor folosind metoda โ€žpublic String getName()โ€.
    2. Obศ›ineศ›i tipul de date al variabilelor folosind metoda โ€žpublic Class getType()โ€.
    3. Obศ›ineศ›i valoarea variabilei folosind metoda โ€žpublic xxx get (Field)โ€.

      Aici, xxx ar putea fi un octet sau scurt de orice tip de valoare pe care dorim sฤƒ o obศ›inem.

    4. Obศ›ineศ›i modificatorii de acces ai variabilelor folosind metodele getModifier() ศ™i Modifier.toString(int i).

      Aici scriem o clasฤƒ pentru a obศ›ine metadatele variabilelor prezente รฎn clasa Guru99VariableMetaData .class:

      Obศ›ineศ›i metadatele variabilei

      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. Obiect de clasฤƒ creat pentru Guru99VariableMetaData.class
      2. Am primit toate metadatele variabilelor dintr-o matrice Field
      3. S-au imprimat toate numele variabilelor din clasa Guru99VariableMetaData.class
      4. S-au imprimat toate tipurile de date ale variabilelor din clasa Guru99VariableMetaData.class
      5. S-au imprimat toศ›i modificatorii de acces ai variabilelor din clasa Guru99VariableMetaData.class
      6. Imprimate valorile tuturor variabilelor din Imprimarea tuturor tipurilor de date ale variabilelor din clasa Guru99VariableMetaData.class

      Obศ›ineศ›i metadatele metodei

      Obศ›ineศ›i metadatele metodei

      Exemplul 3: Cum sฤƒ obศ›ineศ›i metadatele metodei

      Urmฤƒtoarele exemple aratฤƒ cum sฤƒ obศ›ineศ›i metadatele unei metode:

      Aici, creฤƒm o clasฤƒ numitฤƒ Guru99MethodMetaData .class cu unele metode

      Obศ›ineศ›i metadatele metodei

      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");					
          }	
      }

      Paศ™i pentru a obศ›ine metadatele despre metodele din clasa de mai sus:

      1. Creaศ›i obiectul clasei din clasa de mai sus, adicฤƒ Guru99MethodMetaData.class ca mai jos:
        Guru99MethodMetaData  guru99ClassVar  = new Guru99MethodMetaData  ();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
      2. Obศ›ineศ›i informaศ›ii despre metodฤƒ รฎntr-o matrice Method folosind metoda getMethods() ศ™i getDeclaredMethods(), dupฤƒ cum urmeazฤƒ:
        Method[]  guru99 Method 1= guru99ClassObjVar .get Methods();
        Method []  guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        getMethods() metoda returneazฤƒ metadatele metodelor publice din clasa specificatฤƒ, precum ศ™i din superclasa acesteia.

        getDeclaredMethods() metoda returneazฤƒ metadatele tuturor metodelor numai din clasa specificatฤƒ.

      3. Obศ›ineศ›i numele metodei folosind getName () metodฤƒ.
      4. Obศ›ineศ›i tipul de returnare al metodei folosind getReturnType() metodฤƒ.
      5. Obศ›ineศ›i modificatori de acces ai metodelor folosind getModifiers() ศ™i Modifiers.toString(int i) metode.
      6. Obศ›ine tipuri de parametri de metodฤƒ folosind getParameterTypes() metodฤƒ care returneazฤƒ o matrice de clasฤƒ.
      7. Obศ›ineศ›i excepศ›ie folosind getExceptionTypes() metodฤƒ care returneazฤƒ o matrice de clasฤƒ.

      Aici scriem o clasฤƒ pentru a obศ›ine metadatele metodelor prezente รฎn clasa Guru99MethodMetaData.class:

      Obศ›ineศ›i metadatele metodei

      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. Obiect de clasฤƒ creat pentru Guru99MethodMetaData.class
      2. Am primit toate metadatele tuturor metodelor dintr-o matrice Method
      3. S-au imprimat toate numele metodelor prezente รฎn clasa Guru99MethodMetaData.class
      4. Tipuri de returnare tipฤƒrite ale metodelor din clasa Guru99MethodMetaData.class
      5. S-au imprimat toศ›i modificatorii de acces ai metodelor din clasa Guru99MethodMetaData.class
      6. Tipuri de parametri imprimate ale metodelor din Guru99MethodMetaData.class
      7. Excepศ›iile tipฤƒrite sunt aruncate de metodele din Guru99MethodMetaData.class

        Obศ›ineศ›i metadatele metodei

      Obศ›ineศ›i metadatele metodei

      Exemplul 4: Cum sฤƒ obศ›ineศ›i metadatele constructorilor

      Urmฤƒtoarele exemple aratฤƒ cum sฤƒ obศ›ineศ›i metadatele constructorilor:

      Aici, creฤƒm o clasฤƒ numitฤƒ Guru99Constructor.class cu diferiศ›i constructori:

       Obศ›ineศ›i metadatele constructorilor

      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{  }							
      }

      Aici scriem o clasฤƒ pentru a obศ›ine metadatele constructorilor prezenศ›i รฎn clasa Guru99Constructor.class:

      Obศ›ineศ›i metadatele constructorilor

      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. Obiect de clasฤƒ creat pentru Guru99Constructor.class
      2. Am primit toate metadatele tuturor constructorilor dintr-o matrice Constructor
      3. S-au imprimat toate numele constructorilor prezente รฎn clasa Guru99Constructor.class
      4. S-au imprimat toศ›i modificatorii de acces ai constructorilor din clasa Guru99Constructor.class
      5. Tipuri de parametri imprimate ale constructorilor din Guru99Constructor.class
      6. Excepศ›iile tipฤƒrite sunt aruncate de constructori รฎn Guru99Constructor.class

      Obศ›ineศ›i metadatele constructorilor

      Obศ›ineศ›i metadatele constructorilor

      Rezumat

      • Programarea prin reflectare รฎn java ajutฤƒ la preluarea ศ™i modificarea informaศ›iilor despre clase ศ™i membrii clasei, cum ar fi variabile, metode, constructori.
      • Reflection API รฎn Java poate fi implementat folosind clase din pachetul java.lang.reflect ศ™i metodele clasei java.lang.Class.
      • Unele metode frecvent utilizate ale clasei java.lang.Class sunt getName (), getSuperclass (), getInterfaces (), getModifiers () etc.
      • Unele clase utilizate รฎn mod obiศ™nuit รฎn pachetul java.lang.reflect sunt Cรขmp, Metodฤƒ, Constructor, Modificator etc.
      • Reflection API poate accesa metode private ศ™i variabile ale unei clase care ar putea reprezenta o ameninศ›are de securitate.
      • Reflection API este o capacitate puternicฤƒ oferitฤƒ de Java, dar vine cu unele cheltuieli generale, cum ar fi performanศ›ฤƒ mai lentฤƒ, vulnerabilitate de securitate ศ™i probleme de permisiuni. Prin urmare, reflection API ar trebui tratat ca ultima soluศ›ie pentru a efectua o operaศ›ie.

    Rezumaศ›i aceastฤƒ postare cu: