Java Reflection API õpetus koos näitega

Mis on peegeldus Java?

Java Reflektsioon on klassi kõigi võimaluste analüüsimise ja muutmise protsess käitusajal. Reflection API sisse Java kasutatakse klassi ja selle liikmetega manipuleerimiseks, mis sisaldavad käitusajal välju, meetodeid, konstruktorit jne.

Üks peegelduse API eeliseid Java on see, et see võib manipuleerida ka klassi eraliikmetega.

Pakett java.lang.reflect pakub peegelduse rakendamiseks palju klasse java. Klassi java.lang.Class meetodeid kasutatakse konkreetse klassi täielike metaandmete kogumiseks.

Klass paketis java.lang.reflect

Järgmine on nimekiri eri Java klassid failis java.lang.package, et rakendada refleksiooni-

  • Väli: seda klassi kasutatakse deklaratiivse teabe, näiteks andmetüübi, juurdepääsu modifikaatori, muutuja nime ja väärtuse kogumiseks.
  • Meetod: seda klassi kasutatakse deklaratiivse teabe kogumiseks, nagu juurdepääsu modifikaator, tagastustüüp, nimi, parameetri tüübid ja meetodi erandi tüüp.
  • Ehitaja: seda klassi kasutatakse deklaratiivse teabe kogumiseks, nagu juurdepääsu muutja, konstruktori nimi ja parameetritüübid.
  • Muutma: seda klassi kasutatakse teabe kogumiseks konkreetse juurdepääsu modifikaatori kohta.

Java.lang.Classis kasutatavad meetodid

  • Avalik string getName (): tagastab klassi nime.
  • avalik klass getSuperclass(): tagastab superklassi viite
  • Avalik klass[] getInterfaces() : tagastab liideste massiivi, mille on rakendanud määratud klass
  • Avalik saidis getModifiers (): Tagastab täisarvu väärtuse, mis esindab määratud klassi modifikaatoreid, mis tuleb parameetrina edastada "avalik staatiline string toString (int i )” meetod, mis tagastab antud klassi juurdepääsu spetsifikaatori.

Kuidas saada klassi kohta täielikku teavet

Teabe saamiseks selle kohta muutujad, meetodid ja klassi konstruktorid, peame looma klassi objekti.

Java.lang.Classis kasutatavad meetodid

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;
		}
	}
  • Järgmine näide näitab erinevaid viise klassi "klass" objekti loomiseks:
  • Näide 1: Kuidas hankida klassi metaandmeid

    Järgmine näide näitab, kuidas hankida metaandmeid, näiteks klassi nimi, superklassi nimi, rakendatud liidesed ja klassi juurdepääsu modifikaatorid.

    Saame allpool oleva klassi Guru99Base.class metaandmed:

    Hankige klassi metaandmed

    import java.io.Serializable;
    public abstract class Guru99Base implements Serializable,Cloneable {
    }
    
    1. Klassi nimi on: Guru99Base
    2. Selle juurdepääsu modifikaatorid on: avalik ja abstraktne
    3. Sellel on rakendatud liidesed: jadatav ja klooneeritav
    4. Kuna see ei ole ühtegi klassi otseselt laiendanud, on selle superklass: java.lang.Object

    Allpool olev klass saab Guru99Base.class metaandmed ja prindib need:

    Hankige klassi metaandmed

    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. printida klassi nimi, kasutades meetodit getName
    2. Printige superklassi nimi, kasutades meetodit getSuperClass().getName().
    3. Printige juurutatud liideste nimed
    4. Printige klassi kasutatavad juurdepääsumuutjad

    Hankige klassi metaandmed

    Hankige klassi metaandmed

    Näide 2: kuidas hankida muutuja metaandmeid

    Järgmised näited näitavad, kuidas saada muutuja metaandmeid:

    Siin loome mõne muutujaga klassi nimega Guru99VariableMetaData .class:

    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";    
    }	
    
    Toimingud ülaltoodud klassi muutujate kohta metaandmete hankimiseks:
    1. Looge ülaltoodud klassi klassi objekt, st Guru99VariableMetaData.class, nagu allpool:
        Guru99VariableMetaData  guru99ClassVar  = new Guru99VariableMetaData();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
    2. Hankige metaandmed väljamassiivi kujul, kasutades getFields() or getDeclaredFields() meetodid nagu allpool:
      Field[]  guru99Field1= guru99ClassObjVar .getFields();
      Field[]  guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    getFields() meetod tagastab avaliku muutuja metaandmed nii määratud klassist kui ka selle superklassist.

    getDeclaredFields() meetod tagastab ainult määratud klassi kõigi muutujate metaandmed.

    1. Hankige muutujate nimed, kasutades meetodit "public String getName()".
    2. Hankige muutujate andmetüübid, kasutades meetodit "public Class getType()".
    3. Hankige muutuja väärtus, kasutades meetodit "public xxx get (Field)".

      Siin võib xxx olla bait või lühike mis tahes tüüpi väärtusest, mida me tahame tuua.

    4. Hankige muutujate juurdepääsu modifikaatorid meetodite getModifier() ja Modifier.toString(int i) abil.

      Siin kirjutame klassi, et saada klassis Guru99VariableMetaData .class olevate muutujate metaandmed:

      Hankige muutuja metaandmed

      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. Loodud klassiobjekt Guru99VariableMetaData.class jaoks
      2. Sai kõik muutujate metaandmed väljamassiivis
      3. Prinditi kõik muutujate nimed klassis Guru99VariableMetaData.class
      4. Prinditi kõik klassi Guru99VariableMetaData.class muutujate andmetüübid
      5. Prinditi kõik klassi Guru99VariableMetaData.class muutujate juurdepääsu modifikaatorid
      6. Kõikide klassis Guru99VariableMetaData.class olevate muutujate andmetüübid prinditakse välja.

      Hankige meetodi metaandmed

      Hankige meetodi metaandmed

      Näide 3: Kuidas hankida meetodi metaandmeid

      Järgmised näited näitavad, kuidas meetodi metaandmeid hankida.

      Siin loome mõne meetodi abil klassi nimega Guru99MethodMetaData .class

      Hankige meetodi metaandmed

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

      Toimingud ülaltoodud klassi meetodite metaandmete hankimiseks:

      1. Looge ülaltoodud klassi klassi objekt, st Guru99MethodMetaData.class, nagu allpool:
        Guru99MethodMetaData  guru99ClassVar  = new Guru99MethodMetaData  ();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
      2. Hankige meetoditeave massiivist Method, kasutades meetodeid getMethods() ja getDeclaredMethods() nagu allpool:
        Method[]  guru99 Method 1= guru99ClassObjVar .get Methods();
        Method []  guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        getMethods() meetod tagastab avalike meetodite metaandmed nii määratud klassist kui ka selle superklassist.

        getDeclaredMethods() meetod tagastab ainult määratud klassi kõigi meetodite metaandmed.

      3. Hankige kasutatava meetodi nimi getName () meetod.
      4. Hankige kasutatava meetodi tagastustüüp getReturnType() meetod.
      5. Hankige kasutatavate meetodite juurdepääsu modifikaatorid getModifiers() ja Modifiers.toString(int i) meetodid.
      6. Hankige meetodi parameetrite tüübid kasutades getParameterTypes() meetod, mis tagastab klassi massiivi.
      7. Saada visatud erand kasutades getExceptionTypes() meetod, mis tagastab klassi massiivi.

      Siin kirjutame klassi, et saada klassis Guru99MethodMetaData.class olevate meetodite metaandmed:

      Hankige meetodi metaandmed

      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. Loodud klassiobjekt Guru99MethodMetaData.class jaoks
      2. Sai kõigi meetodite metaandmed meetodi massiivi
      3. Prinditi kõik klassis Guru99MethodMetaData.class olevad meetodite nimed
      4. Klassi Guru99MethodMetaData.class olevate meetodite prinditud tagastustüübid
      5. Prinditi kõik klassi Guru99MethodMetaData.class meetodite juurdepääsumuutjad
      6. Guru99MethodMetaData.class meetodite trükitud parameetritüübid
      7. Prinditud erandid loovad Guru99MethodMetaData.class meetodid

        Hankige meetodi metaandmed

      Hankige meetodi metaandmed

      Näide 4: kuidas hankida konstruktorite metaandmeid

      Järgmised näited näitavad, kuidas hankida konstruktorite metaandmeid.

      Siin loome erinevate konstruktoritega klassi nimega Guru99Constructor.class:

      Hankige konstruktorite metaandmeid

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

      Siin kirjutame klassi, et saada klassis Guru99Constructor.class olevate konstruktorite metaandmed:

      Hankige konstruktorite metaandmeid

      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. Loodud klassiobjekt Guru99Constructor.class jaoks
      2. Sai kõik konstruktorite metaandmed Constructori massiivi
      3. Prinditi kõik klassis Guru99Constructor.class esinevad konstruktorite nimed
      4. Prinditi kõik klassi Guru99Constructor.class konstruktorite juurdepääsumuutjad
      5. Guru99Constructor.class konstruktorite prinditud parameetritüübid
      6. Prinditud erandid viskavad Guru99Constructor.class konstruktorid

      Hankige konstruktorite metaandmeid

      Hankige konstruktorite metaandmeid

      kokkuvõte

      • Peegelduse programmeerimine java-s aitab hankida ja muuta teavet klasside ja klassiliikmete kohta, nagu muutujad, meetodid, konstruktorid.
      • Reflection API sisse Java saab realiseerida kasutades java.lang.reflect paketi klasse ja java.lang.Class klassi meetodeid.
      • Mõned klassi java.lang.Class sagedamini kasutatavad meetodid on getName (), getSuperclass (), getInterfaces (), getModifiers () jne.
      • Mõned java.lang.reflecti paketis sagedamini kasutatavad klassid on väli, meetod, konstruktor, muutja jne.
      • Reflection API pääseb juurde privaatstele meetoditele ja klassi muutujatele, mis võivad olla turvaohuks.
      • Reflection API on võimas võimalus, mida pakub Java, kuid sellega kaasnevad mõned lisakulud, nagu aeglasem jõudlus, turvahaavatavus ja lubade probleem. Seetõttu tuleks refleksiooni API-d käsitleda toimingu sooritamise viimase abinõuna.