Java Reflection API Tutorial med eksempel

Hva er refleksjon i Java?

Java Refleksjon er prosessen med å analysere og endre alle egenskapene til en klasse under kjøring. Reflection API in Java brukes til å manipulere klassen og dens medlemmer som inkluderer felt, metoder, konstruktør, etc. under kjøring.

En fordel med refleksjon API i Java er, det kan manipulere private medlemmer av klassen også.

Java.lang.reflect-pakken gir mange klasser for å implementere refleksjonsjava. Metoder for java.lang.Class-klassen brukes til å samle fullstendig metadata for en bestemt klasse.

Klasse i java.lang.reflect-pakken

Følgende er en liste over ulike Java klasser i java.lang.package for å implementere refleksjon-

  • Felt: Denne klassen brukes til å samle deklarativ informasjon som datatype, tilgangsmodifikator, navn og verdi på en variabel.
  • Metode: Denne klassen brukes til å samle deklarativ informasjon som tilgangsmodifikator, returtype, navn, parametertyper og unntakstype for en metode.
  • Constructor: Denne klassen brukes til å samle deklarativ informasjon som tilgangsmodifikator, navn og parametertyper for en konstruktør.
  • endring: Denne klassen brukes til å samle informasjon om en bestemt tilgangsmodifikator.

Metoder brukt i java.lang.Class

  • Offentlig streng getName (): Returnerer navnet på klassen.
  • offentlig klasse getSuperclass(): Returnerer superklassereferansen
  • Offentlig klasse[] getInterfaces() : Returnerer en rekke grensesnitt implementert av den angitte klassen
  • Offentlig i getModifiers (): Returnerer en heltallsverdi som representerer modifikatorene til den angitte klassen som må sendes som en parameter til "offentlig statisk streng til streng (int i )" metode som returnerer tilgangsspesifikasjonen for den gitte klassen.

Hvordan få fullstendig informasjon om en klasse

For å få informasjon om variabler, metoder og konstruktører av en klasse, må vi lage et objekt av klassen.

Metoder brukt 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ølgende eksempel viser forskjellige måter å lage objekt av klassen "klasse" på:
  • Eksempel 1: Hvordan få metadata av klasse

    Følgende eksempel viser hvordan du får metadata som: Klassenavn, superklassenavn, implementerte grensesnitt og tilgangsmodifikatorer for en klasse.

    Vi vil få metadataene til klassen nedenfor kalt Guru99Base.class:

    Få metadata for klasse

    import java.io.Serializable;
    public abstract class Guru99Base implements Serializable,Cloneable {
    }
    
    1. Navnet på klassen er: Guru99Base
    2. Dets tilgangsmodifikatorer er: offentlig og abstrakt
    3. Den har implementert grensesnitt: Serialiserbar og Klonbar
    4. Siden den ikke har utvidet noen klasse eksplisitt, er dens superklasse: java.lang.Object

    Klassen nedenfor vil få metadataene til Guru99Base.class og skrive dem ut:

    Få metadata for klasse

    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 navnet på klassen ved å bruke getName-metoden
    2. Skriv ut navnet på superklassen ved å bruke getSuperClass().getName()-metoden
    3. Skriv ut navnet på de implementerte grensesnittene
    4. Skriv ut tilgangsmodifikatorene som brukes av klassen

    Få metadata for klasse

    Få metadata for klasse

    Eksempel 2: Hvordan få metadata av variabel

    Følgende eksempler viser hvordan du får metadata for variabel:

    Her lager vi en klasse kalt Guru99VariableMetaData .class med noen 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";    
    }	
    
    Trinn for å få metadata om variablene i klassen ovenfor:
    1. Lag klasseobjektet til klassen ovenfor, dvs. Guru99VariableMetaData.class som nedenfor:
        Guru99VariableMetaData  guru99ClassVar  = new Guru99VariableMetaData();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
    2. Få metadataene i form av feltarray ved å bruke getFields() or getDeclaredFields() metoder som nedenfor:
      Field[]  guru99Field1= guru99ClassObjVar .getFields();
      Field[]  guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    getFields() metoden returnerer metadata for den offentlige variabelen fra den spesifiserte klassen så vel som fra dens superklasse.

    getDeclaredFields() metoden returnerer kun metadata for alle variablene fra den angitte klassen.

    1. Få navnet på variablene ved å bruke "public String getName()"-metoden.
    2. Få datatypen til variablene ved å bruke "public Class getType()"-metoden.
    3. Få verdien av variabelen ved å bruke "public xxx get (Field)"-metoden.

      Her kan xxx være en byte eller kort av en hvilken som helst type verdi vi ønsker å hente.

    4. Få tilgangsmodifikatorene til variablene ved å bruke metodene getModifier() og Modifier.toString(int i).

      Her skriver vi en klasse for å få metadataene til variablene som finnes 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. Opprettet klasseobjekt for Guru99VariableMetaData.class
      2. Fikk alle metadataene til variablene i en feltmatrise
      3. Skrive ut alle variabelnavnene i klassen Guru99VariableMetaData.class
      4. Skrive ut alle datatypene til variablene i klassen Guru99VariableMetaData.class
      5. Skrive ut alle tilgangsmodifikatorene til variablene i klassen Guru99VariableMetaData.class
      6. Utskrevne verdier av alle variablene i Skrive ut alle datatypene til variablene i klassen Guru99VariableMetaData.class

      Få metadata av metode

      Få metadata av metode

      Eksempel 3: Hvordan få metadata av metode

      Følgende eksempler viser hvordan du får metadata for en metode:

      Her lager vi en klasse kalt Guru99MethodMetaData .class med noen metoder

      Få metadata av metode

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

      Trinn for å få metadata om metodene i klassen ovenfor:

      1. Lag klasseobjektet til klassen ovenfor, dvs. Guru99MethodMetaData.class som nedenfor:
        Guru99MethodMetaData  guru99ClassVar  = new Guru99MethodMetaData  ();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
      2. Få metodeinformasjon i en Method-array ved å bruke getMethods() og getDeclaredMethods() metoden som nedenfor:
        Method[]  guru99 Method 1= guru99ClassObjVar .get Methods();
        Method []  guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        getMethods() metoden returnerer metadata for de offentlige metodene fra den spesifiserte klassen så vel som fra dens superklasse.

        getDeclaredMethods() metoden returnerer kun metadata for alle metodene fra den angitte klassen.

      3. Få navnet på metoden ved å bruke getName () metoden.
      4. Få returtypen til metoden ved hjelp av getReturnType() metoden.
      5. Få tilgang modifikatorer av metodene som bruker getModifiers() og Modifiers.toString(int i) metoder.
      6. Få metodeparametertyper ved hjelp av getParameterTypes() metode som returnerer en klassematrise.
      7. Få kastet unntak ved hjelp av getExceptionTypes() metode som returnerer en klassematrise.

      Her skriver vi en klasse for å få metadataene til metodene som finnes i klassen Guru99MethodMetaData.class:

      Få metadata av metode

      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. Opprettet klasseobjekt for Guru99MethodMetaData.class
      2. Fikk alle metadataene til alle metodene i en Method-array
      3. Skrivet ut alle metodenavnene som finnes i klassen Guru99MethodMetaData.class
      4. Utskrevne returtyper av metodene i klassen Guru99MethodMetaData.class
      5. Har skrevet ut alle tilgangsmodifikatorene til metodene i klassen Guru99MethodMetaData.class
      6. Utskrevne parametertyper av metodene i Guru99MethodMetaData.class
      7. Utskrevne unntak blir kastet av metoder i Guru99MethodMetaData.class

        Få metadata av metode

      Få metadata av metode

      Eksempel 4: Hvordan få metadata fra konstruktører

      Følgende eksempler viser hvordan du får metadata fra konstruktører:

      Her lager vi en klasse kalt Guru99Constructor.class med forskjellige konstruktører:

      Få metadata fra 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{  }							
      }

      Her skriver vi en klasse for å få metadataene til konstruktørene som er tilstede i klassen Guru99Constructor.class:

      Få metadata fra 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. Laget klasseobjekt for Guru99Constructor.class
      2. Fikk alle metadataene til alle konstruktørene i en Constructor-array
      3. Skrivet ut alle konstruktørnavnene som er tilstede i klassen Guru99Constructor.class
      4. Skrivet ut alle tilgangsmodifikatorene til konstruktørene i klassen Guru99Constructor.class
      5. Utskrevne parametertyper av konstruktørene i Guru99Constructor.class
      6. Utskrevne unntak er kastet av konstruktører i Guru99Constructor.class

      Få metadata fra konstruktører

      Få metadata fra konstruktører

      Sammendrag

      • Refleksjonsprogrammering i java hjelper til med å hente og endre informasjon om klasser og klassemedlemmer som variable, metoder, konstruktører.
      • Reflection API in Java kan implementeres ved å bruke klasser i java.lang.reflect-pakken og metoder for java.lang.Class-klassen.
      • Noen vanlige metoder for java.lang.Class-klassen er getName (), getSuperclass (), getInterfaces (), getModifiers () osv.
      • Noen ofte brukte klasser i java.lang.reflect-pakken er Field, Method, Constructor, Modifier, etc.
      • Reflection API kan få tilgang til private metoder og variabler i en klasse som kan være en sikkerhetstrussel.
      • Reflection API er en kraftig funksjon levert av Java, men det kommer med noen faste kostnader som tregere ytelse, sikkerhetssårbarhet og tillatelsesproblem. Derfor bør refleksjons-API behandles som siste utvei for å utføre en operasjon.