Java Tutoriel API Reflection avec exemple

Qu'est-ce que la rรฉflexion dans Java?

Java La rรฉflexion est le processus d'analyse et de modification de toutes les capacitรฉs d'une classe au moment de l'exรฉcution. API de rรฉflexion dans Java est utilisรฉ pour manipuler la classe et ses membres qui incluent des champs, des mรฉthodes, un constructeur, etc. au moment de l'exรฉcution.

Un avantage de l'API de rรฉflexion dans Java c'est-ร -dire qu'il peut รฉgalement manipuler des membres privรฉs de la classe.

Le package java.lang.reflect fournit de nombreuses classes pour implรฉmenter la rรฉflexion java. Les mรฉthodes de la classe java.lang.Class sont utilisรฉes pour rassembler les mรฉtadonnรฉes complรจtes d'une classe particuliรจre.

Classe dans le package java.lang.reflect

Voici une liste de divers Java les classes dans java.lang.package pour implรฉmenter la rรฉflexion-

  • Champ: Cette classe est utilisรฉe pour rassembler des informations dรฉclaratives telles que le type de donnรฉes, le modificateur d'accรจs, le nom et la valeur d'une variable.
  • Mรฉthode: Cette classe est utilisรฉe pour rassembler des informations dรฉclaratives telles que le modificateur d'accรจs, le type de retour, le nom, les types de paramรจtres et le type d'exception d'une mรฉthode.
  • Constructeur: Cette classe est utilisรฉe pour rassembler des informations dรฉclaratives telles que le modificateur d'accรจs, le nom et les types de paramรจtres d'un constructeur.
  • Modifier: Cette classe est utilisรฉe pour collecter des informations sur un modificateur d'accรจs particulier.

Mรฉthodes utilisรฉes dans java.lang.Class

  • Chaรฎne publique getName (): Renvoie le nom de la classe.
  • Classe publique getSuperclass(): Renvoie la rรฉfรฉrence de la super classe
  • Classe publique[] getInterfaces() : Renvoie un tableau d'interfaces implรฉmentรฉes par la classe spรฉcifiรฉe
  • Public dans getModifiers() : Renvoie une valeur entiรจre reprรฉsentant les modificateurs de la classe spรฉcifiรฉe qui doit รชtre passรฉe en paramรจtre ร  ยซchaรฎne statique publique toString (int i ) ยป mรฉthode qui renvoie le spรฉcificateur dโ€™accรจs pour la classe donnรฉe.

Comment obtenir des informations complรจtes sur une classe

Pour obtenir des informations sur les variables, les mรฉthodes et les constructeurs d'une classe, nous devons crรฉer un objet de la classe.

Mรฉthodes utilisรฉes dans 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;
		}
	}
  • L'exemple suivant montre diffรฉrentes maniรจres de crรฉer un objet de classe ยซ class ยป :
  • Exemple 1 : Comment obtenir les mรฉtadonnรฉes de la classe

    L'exemple suivant montre comment obtenir des mรฉtadonnรฉes telles que : le nom de classe, le nom de super classe, les interfaces implรฉmentรฉes et les modificateurs d'accรจs d'une classe.

    Nous obtiendrons les mรฉtadonnรฉes de la classe ci-dessous nommรฉe Guru99Base.class :

    Obtenir les mรฉtadonnรฉes de la classe

    import java.io.Serializable;
    public abstract class Guru99Base implements Serializable,Cloneable {
    }
    
    1. Le nom de la classe est : Guru99Base
    2. Ses modificateurs d'accรจs sont : public et abstrait
    3. Il a implรฉmentรฉ des interfaces : sรฉrialisable et clonable
    4. Puisqu'elle n'a รฉtendu explicitement aucune classe, sa super classe est : java.lang.Object

    La classe ci-dessous obtiendra les mรฉtadonnรฉes de Guru99Base.class et les imprimera :

    Obtenir les mรฉtadonnรฉes de la 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. imprimer le nom de la classe en utilisant la mรฉthode getName
    2. Imprimez le nom de la super classe en utilisant la mรฉthode getSuperClass().getName()
    3. Imprimer le nom des interfaces implรฉmentรฉes
    4. Imprimer les modificateurs d'accรจs utilisรฉs par la classe

    Obtenir les mรฉtadonnรฉes de la classe

    Obtenir les mรฉtadonnรฉes de la classe

    Exemple 2 : Comment obtenir les mรฉtadonnรฉes d'une variable

    Les exemples suivants montrent comment obtenir les mรฉtadonnรฉes d'une variable :

    Ici, nous crรฉons une classe nommรฉe Guru99VariableMetaData .class avec quelques variables :

    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";    
    }	
    
    ร‰tapes pour obtenir les mรฉtadonnรฉes sur les variables de la classe ci-dessus :
    1. Crรฉez l'objet de classe de la classe ci-dessus, c'est-ร -dire Guru99VariableMetaData.class comme ci-dessous :
        Guru99VariableMetaData  guru99ClassVar  = new Guru99VariableMetaData();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
    2. Obtenez les mรฉtadonnรฉes sous forme de tableau de champs en utilisant getFields() or getDeclaredFields () mรฉthodes comme ci-dessous :
      Field[]  guru99Field1= guru99ClassObjVar .getFields();
      Field[]  guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    getFields() La mรฉthode renvoie les mรฉtadonnรฉes de la variable publique de la classe spรฉcifiรฉe ainsi que de sa super classe.

    getDeclaredFields () La mรฉthode renvoie uniquement les mรฉtadonnรฉes de toutes les variables de la classe spรฉcifiรฉe.

    1. Obtenez le nom des variables en utilisant la mรฉthode ยซ public String getName() ยป.
    2. Obtenez le type de donnรฉes des variables en utilisant la mรฉthode ยซ public Class getType() ยป.
    3. Obtenez la valeur de la variable en utilisant la mรฉthode ยซ public xxx get (Field) ยป.

      Ici, xxx peut รชtre un octet ou une valeur courte de tout type de valeur que nous souhaitons rรฉcupรฉrer.

    4. Obtenez les modificateurs d'accรจs des variables ร  l'aide des mรฉthodes getModifier() et Modifier.toString(int i).

      Ici, nous รฉcrivons une classe pour rรฉcupรฉrer les mรฉtadonnรฉes des variables prรฉsentes dans la classe Guru99VariableMetaData .class :

      Obtenir les mรฉtadonnรฉes de la variable

      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. Objet de classe crรฉรฉ pour Guru99VariableMetaData.class
      2. Vous avez toutes les mรฉtadonnรฉes des variables dans un tableau Field
      3. Imprimรฉ tous les noms de variables dans la classe Guru99VariableMetaData.class
      4. Imprimรฉ tous les types de donnรฉes des variables de la classe Guru99VariableMetaData.class
      5. Imprimรฉ tous les modificateurs d'accรจs des variables de la classe Guru99VariableMetaData.class
      6. Valeurs imprimรฉes de toutes les variables dans Imprimรฉ tous les types de donnรฉes des variables de la classe Guru99VariableMetaData.class

      Obtenir les mรฉtadonnรฉes de la mรฉthode

      Obtenir les mรฉtadonnรฉes de la mรฉthode

      Exemple 3 : Comment obtenir les mรฉtadonnรฉes de la mรฉthode

      Les exemples suivants montrent comment obtenir les mรฉtadonnรฉes d'une mรฉthode :

      Ici, nous crรฉons une classe nommรฉe Guru99MethodMetaData .class avec quelques mรฉthodes

      Obtenir les mรฉtadonnรฉes de la mรฉthode

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

      ร‰tapes pour obtenir les mรฉtadonnรฉes sur les mรฉthodes de la classe ci-dessus :

      1. Crรฉez l'objet de classe de la classe ci-dessus, c'est-ร -dire Guru99MethodMetaData.class comme ci-dessous :
        Guru99MethodMetaData  guru99ClassVar  = new Guru99MethodMetaData  ();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
      2. Obtenez des informations sur la mรฉthode dans un tableau Method ร  lโ€™aide des mรฉthodes getMethods() et getDeclaredMethods() comme ci-dessous :
        Method[]  guru99 Method 1= guru99ClassObjVar .get Methods();
        Method []  guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        getMethods() La mรฉthode renvoie les mรฉtadonnรฉes des mรฉthodes publiques de la classe spรฉcifiรฉe ainsi que de sa super classe.

        getDeclaredMethods() La mรฉthode renvoie uniquement les mรฉtadonnรฉes de toutes les mรฉthodes de la classe spรฉcifiรฉe.

      3. Obtenez le nom de la mรฉthode en utilisant getName () mรฉthode.
      4. Obtenez le type de retour de la mรฉthode en utilisant getReturnType() mรฉthode.
      5. Obtenez les modificateurs d'accรจs des mรฉthodes en utilisant getModifiers() et Modifiers.toString(int i) mรฉthodes.
      6. Obtenez les types de paramรจtres de mรฉthode en utilisant getParameterTypes() mรฉthode qui renvoie un tableau de classes.
      7. Obtenez une exception levรฉe en utilisant getExceptionTypes() mรฉthode qui renvoie un tableau de classes.

      Ici, nous รฉcrivons une classe pour rรฉcupรฉrer les mรฉtadonnรฉes des mรฉthodes prรฉsentes dans la classe Guru99MethodMetaData.class :

      Obtenir les mรฉtadonnรฉes de la mรฉthode

      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. Objet de classe crรฉรฉ pour Guru99MethodMetaData.class
      2. Vous avez toutes les mรฉtadonnรฉes de toutes les mรฉthodes dans un tableau de mรฉthodes
      3. Imprimรฉ tous les noms de mรฉthodes prรฉsents dans la classe Guru99MethodMetaData.class
      4. Types de retour imprimรฉs des mรฉthodes de la classe Guru99MethodMetaData.class
      5. Imprimรฉ tous les modificateurs d'accรจs des mรฉthodes de la classe Guru99MethodMetaData.class
      6. Types de paramรจtres imprimรฉs des mรฉthodes dans Guru99MethodMetaData.class
      7. Les exceptions imprimรฉes sont levรฉes par les mรฉthodes dans Guru99MethodMetaData.class

        Obtenir les mรฉtadonnรฉes de la mรฉthode

      Obtenir les mรฉtadonnรฉes de la mรฉthode

      Exemple 4 : Comment obtenir les mรฉtadonnรฉes des constructeurs

      Les exemples suivants montrent comment obtenir les mรฉtadonnรฉes des constructeurs :

      Ici, nous crรฉons une classe nommรฉe Guru99Constructor.class avec diffรฉrents constructeurs :

       Obtenir les mรฉtadonnรฉes des constructeurs

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

      Ici, nous รฉcrivons une classe pour rรฉcupรฉrer les mรฉtadonnรฉes des constructeurs prรฉsents dans la classe Guru99Constructor.class :

      Obtenir les mรฉtadonnรฉes des constructeurs

      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. Objet de classe crรฉรฉ pour Guru99Constructor.class
      2. Vous avez toutes les mรฉtadonnรฉes de tous les constructeurs dans un tableau Constructor
      3. Imprimรฉ tous les noms de constructeurs prรฉsents dans la classe Guru99Constructor.class
      4. Imprimรฉ tous les modificateurs d'accรจs des constructeurs dans la classe Guru99Constructor.class
      5. Types de paramรจtres imprimรฉs des constructeurs dans Guru99Constructor.class
      6. Les exceptions imprimรฉes sont levรฉes par les constructeurs dans Guru99Constructor.class

      Obtenir les mรฉtadonnรฉes des constructeurs

      Obtenir les mรฉtadonnรฉes des constructeurs

      Rรฉsumรฉ

      • La programmation de rรฉflexion en Java aide ร  rรฉcupรฉrer et ร  modifier des informations sur les classes et les membres de la classe, telles que les variables, les mรฉthodes et les constructeurs.
      • API de rรฉflexion dans Java peut รชtre implรฉmentรฉ ร  l'aide des classes du package java.lang.reflect et des mรฉthodes de la classe java.lang.Class.
      • Certaines mรฉthodes couramment utilisรฉes de la classe java.lang.Class sont getName (), getSuperclass (), getInterfaces (), getModifiers () etc.
      • Certaines classes couramment utilisรฉes dans le package java.lang.reflect sont Field, Method, Constructor, Modifier, etc.
      • L'API Reflection peut accรฉder aux mรฉthodes privรฉes et aux variables d'une classe qui pourraient constituer une menace pour la sรฉcuritรฉ.
      • L'API Reflection est une fonctionnalitรฉ puissante fournie par Java, mais cela implique certains frais gรฉnรฉraux tels que des performances plus lentes, une vulnรฉrabilitรฉ de sรฉcuritรฉ et des problรจmes d'autorisation. Par consรฉquent, l'API de rรฉflexion doit รชtre considรฉrรฉe comme le dernier recours pour effectuer une opรฉration.

    Rรฉsumez cet article avec :