Java Reflection API Tutorial med exempel

Vad รคr reflektion i Java?

Java Reflektion รคr processen att analysera och modifiera alla funktioner i en klass vid kรถrning. Reflection API in Java anvรคnds fรถr att manipulera klass och dess medlemmar som inkluderar fรคlt, metoder, konstruktorer, etc. vid kรถrning.

En fรถrdel med reflektions-API i Java รคr att det kan manipulera privata medlemmar i klassen ocksรฅ.

Paketet java.lang.reflect tillhandahรฅller mรฅnga klasser fรถr att implementera reflektionsjava. Metoder fรถr klassen java.lang.Class anvรคnds fรถr att samla in fullstรคndig metadata fรถr en viss klass.

Klass i java.lang.reflect-paketet

Fรถljande รคr en lista รถver olika Java klasser i java.lang.package fรถr att implementera reflektion-

  • Fรคlt: Denna klass anvรคnds fรถr att samla in deklarativ information som datatyp, รฅtkomstmodifierare, namn och vรคrde pรฅ en variabel.
  • Metod: Denna klass anvรคnds fรถr att samla in deklarativ information sรฅsom รฅtkomstmodifierare, returtyp, namn, parametertyper och undantagstyp fรถr en metod.
  • Konstruktรถr: Denna klass anvรคnds fรถr att samla in deklarativ information sรฅsom รฅtkomstmodifierare, namn och parametertyper fรถr en konstruktor.
  • byta: Denna klass anvรคnds fรถr att samla information om en viss รฅtkomstmodifierare.

Metoder som anvรคnds i java.lang.Class

  • Public String getName (): Returnerar namnet pรฅ klassen.
  • public Class getSuperclass(): Returnerar superklassreferensen
  • Public Class[] getInterfaces() : Returnerar en uppsรคttning grรคnssnitt implementerade av den angivna klassen
  • Offentlig i getModifiers (): Returnerar ett heltalsvรคrde som representerar modifierarna fรถr den angivna klassen som mรฅste skickas som en parameter till "public static String toString (int i )" metod som returnerar รฅtkomstspecifikationen fรถr den givna klassen.

Hur man fรฅr fullstรคndig information om en klass

Fรถr att fรฅ information om variabler, metoder och konstruktรถrer fรถr en klass, mรฅste vi skapa ett objekt av klassen.

Metoder som anvรคnds i 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;
		}
	}
  • Fรถljande exempel visar olika sรคtt att skapa objekt av klassen "klass":
  • Exempel 1: Hur man fรฅr metadata av klass

    Fรถljande exempel visar hur man fรฅr metadata som: Klassnamn, superklassnamn, implementerade grรคnssnitt och รฅtkomstmodifierare fรถr en klass.

    Vi kommer att fรฅ metadata frรฅn nedanstรฅende klass som heter Guru99Base.class:

    Fรฅ metadata av klass

    import java.io.Serializable;
    public abstract class Guru99Base implements Serializable,Cloneable {
    }
    
    1. Klassens namn รคr: Guru99Base
    2. Dess รฅtkomstmodifierare รคr: offentliga och abstrakta
    3. Den har implementerat grรคnssnitt: Serialiserbar och Klonbar
    4. Eftersom den inte har utรถkat nรฅgon klass explicit, รคr dens superklass: java.lang.Object

    Nedan klass kommer att fรฅ metadata fรถr Guru99Base.class och skriva ut den:

    Fรฅ metadata av klass

    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. skriv ut namnet pรฅ klassen med metoden getName
    2. Skriv ut namnet pรฅ superklassen med metoden getSuperClass().getName().
    3. Skriv ut namnet pรฅ de implementerade grรคnssnitten
    4. Skriv ut de รฅtkomstmodifierare som anvรคnds av klassen

    Fรฅ metadata av klass

    Fรฅ metadata av klass

    Exempel 2: Hur man fรฅr metadata av variabel

    Fรถljande exempel visar hur man fรฅr metadata fรถr variabel:

    Hรคr skapar vi en klass som heter Guru99VariableMetaData .class med nรฅgra variabler:

    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";    
    }	
    
    Steg fรถr att fรฅ metadata om variablerna i ovanstรฅende klass:
    1. Skapa klassobjektet fรถr ovanstรฅende klass, dvs Guru99VariableMetaData.class enligt nedan:
        Guru99VariableMetaData  guru99ClassVar  = new Guru99VariableMetaData();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
    2. Fรฅ metadata i form av field array med hjรคlp av getFields() or getDeclaredFields() metoder enligt nedan:
      Field[]  guru99Field1= guru99ClassObjVar .getFields();
      Field[]  guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    getFields() metod returnerar metadata fรถr den publika variabeln frรฅn den angivna klassen sรฅvรคl som frรฅn dess superklass.

    getDeclaredFields() metod returnerar endast metadata fรถr alla variabler frรฅn den angivna klassen.

    1. Hรคmta namnet pรฅ variablerna med metoden "public String getName()".
    2. Hรคmta datatypen fรถr variablerna med metoden "public Class getType()".
    3. Fรฅ vรคrdet pรฅ variabeln med metoden "public xxx get (Field)".

      Hรคr kan xxx vara en byte eller kort av nรฅgon typ av vรคrde vi vill hรคmta.

    4. Hรคmta รฅtkomstmodifierarna fรถr variablerna med metoderna getModifier() och Modifier.toString(int i).

      Hรคr skriver vi en klass fรถr att fรฅ metadata fรถr variablerna som finns i klassen Guru99VariableMetaData .class:

      Fรฅ metadata av variabel

      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. Skapat klassobjekt fรถr Guru99VariableMetaData.class
      2. Fick all metadata fรถr variablerna i en Field-array
      3. Skrev ut alla variabelnamn i klassen Guru99VariableMetaData.class
      4. Skriver ut alla datatyper fรถr variablerna i klassen Guru99VariableMetaData.class
      5. Skriver ut alla รฅtkomstmodifierare fรถr variablerna i klassen Guru99VariableMetaData.class
      6. Utskrivna vรคrden fรถr alla variabler i Utskrivna alla datatyper fรถr variablerna i klassen Guru99VariableMetaData.class

      Fรฅ metadata av metod

      Fรฅ metadata av metod

      Exempel 3: Hur man skaffar Metadata of Method

      Fรถljande exempel visar hur man fรฅr metadata fรถr en metod:

      Hรคr skapar vi en klass som heter Guru99MethodMetaData .class med nรฅgra metoder

      Fรฅ metadata av metod

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

      Steg fรถr att fรฅ metadata om metoderna i ovanstรฅende klass:

      1. Skapa klassobjektet fรถr ovanstรฅende klass, dvs Guru99MethodMetaData.class enligt nedan:
        Guru99MethodMetaData  guru99ClassVar  = new Guru99MethodMetaData  ();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
      2. Hรคmta metodinformation i en metodmatris med metoderna getMethods() och getDeclaredMethods() enligt nedan:
        Method[]  guru99 Method 1= guru99ClassObjVar .get Methods();
        Method []  guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        getMethods() metod returnerar metadata fรถr de offentliga metoderna frรฅn den angivna klassen sรฅvรคl som frรฅn dess superklass.

        getDeclaredMethods() metod returnerar endast metadata fรถr alla metoder frรฅn den angivna klassen.

      3. Fรฅ namnet pรฅ metoden med hjรคlp av hรคmta namn () metod.
      4. Hรคmta returtypen fรถr metoden med hjรคlp av getReturnType() metod.
      5. Fรฅ รฅtkomstmodifierare av metoderna som anvรคnder getModifiers() och Modifiers.toString(int i) metoder.
      6. Hรคmta metodparametertyper med hjรคlp av getParameterTypes() metod som returnerar en klassmatris.
      7. Bli kastat undantag med hjรคlp av getExceptionTypes() metod som returnerar en klassmatris.

      Hรคr skriver vi en klass fรถr att fรฅ metadata fรถr metoderna som finns i klassen Guru99MethodMetaData.class:

      Fรฅ metadata av metod

      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. Skapat klassobjekt fรถr Guru99MethodMetaData.class
      2. Fick all metadata fรถr alla metoder i en Method array
      3. Skrev ut alla metodnamn som finns i klassen Guru99MethodMetaData.class
      4. Utskrivna returtyper av metoderna i klassen Guru99MethodMetaData.class
      5. Skrivit ut alla รฅtkomstmodifierare fรถr metoderna i klassen Guru99MethodMetaData.class
      6. Utskrivna parametertyper av metoderna i Guru99MethodMetaData.class
      7. Utskrivna undantag kastas av metoder i Guru99MethodMetaData.class

        Fรฅ metadata av metod

      Fรฅ metadata av metod

      Exempel 4: Hur man fรฅr metadata frรฅn konstruktรถrer

      Fรถljande exempel visar hur man fรฅr metadata frรฅn konstruktรถrer:

      Hรคr skapar vi en klass som heter Guru99Constructor.class med olika konstruktรถrer:

       Fรฅ metadata frรฅn konstruktรถrer

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

      Hรคr skriver vi en klass fรถr att fรฅ metadata fรถr konstruktรถrerna som finns i klassen Guru99Constructor.class:

      Fรฅ metadata frรฅn konstruktรถrer

      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. Skapat klassobjekt fรถr Guru99Constructor.class
      2. Fick all metadata fรถr alla konstruktรถrer i en Constructor-array
      3. Skrivet ut alla konstruktรถrens namn som finns i klassen Guru99Constructor.class
      4. Skrev ut alla รฅtkomstmodifierare fรถr konstruktรถrerna i klassen Guru99Constructor.class
      5. Utskrivna parametertyper av konstruktรถrerna i Guru99Constructor.class
      6. Utskrivna undantag kastas av konstruktรถrer i Guru99Constructor.class

      Fรฅ metadata frรฅn konstruktรถrer

      Fรฅ metadata frรฅn konstruktรถrer

      Sammanfattning

      • Reflektionsprogrammering i java hjรคlper till att hรคmta och รคndra information om klasser och klassmedlemmar sรฅsom variabler, metoder, konstruktorer.
      • Reflection API in Java kan implementeras med hjรคlp av klasser i paketet java.lang.reflect och metoder fรถr klassen java.lang.Class.
      • Nรฅgra vanliga metoder fรถr java.lang.Class-klassen รคr getName (), getSuperclass (), getInterfaces (), getModifiers () etc.
      • Nรฅgra vanliga klasser i java.lang.reflect-paketet รคr Field, Method, Constructor, Modifier, etc.
      • Reflection API kan komma รฅt privata metoder och variabler av en klass som kan vara ett sรคkerhetshot.
      • Reflection API รคr en kraftfull funktion som tillhandahรฅlls av Java, men det kommer med vissa omkostnader som lรฅngsammare prestanda, sรคkerhetssรฅrbarhet och behรถrighetsproblem. Reflektions-API bรถr dรคrfรถr behandlas som den sista utvรคgen fรถr att utfรถra en operation.

    Sammanfatta detta inlรคgg med: