Java Vodič za Reflection API s primjerom

U čemu je Reflection Java?

Java Refleksija je proces analiziranja i modificiranja svih mogućnosti klase tijekom izvođenja. Reflection API u Java koristi se za manipuliranje klasom i njezinim članovima koji uključuju polja, metode, konstruktor itd. tijekom izvođenja.

Jedna prednost API-ja refleksije u Java jest, može manipulirati i privatnim članovima klase.

Paket java.lang.reflect pruža mnoge klase za implementaciju refleksije java. Metode klase java.lang.Class koriste se za prikupljanje kompletnih metapodataka određene klase.

Klasa u paketu java.lang.reflect

Slijedi popis razne Java Nastava u java.lang.package za implementaciju refleksije-

  • Polje: Ova se klasa koristi za prikupljanje deklarativnih informacija kao što su tip podataka, modifikator pristupa, naziv i vrijednost varijable.
  • način: Ova se klasa koristi za prikupljanje deklarativnih informacija kao što su modifikator pristupa, tip povrata, naziv, tipovi parametara i tip iznimke metode.
  • Konstruktor: Ova se klasa koristi za prikupljanje deklarativnih informacija kao što su modifikator pristupa, naziv i tipovi parametara konstruktora.
  • Promijeniti: Ova se klasa koristi za prikupljanje informacija o određenom modifikatoru pristupa.

Metode korištene u java.lang.Class

  • Javni niz getName (): Vraća naziv klase.
  • javna klasa getSuperclass(): Vraća referencu super klase
  • Javna klasa[] getInterfaces() : Vraća niz sučelja implementiranih od strane navedene klase
  • Javno u getModifiers (): Vraća cjelobrojnu vrijednost koja predstavlja modifikatore navedene klase koju je potrebno proslijediti kao parametar u "javni statički niz u niz (int i )” metoda koja vraća specifikator pristupa za danu klasu.

Kako dobiti potpunu informaciju o razredu

Da biste dobili informacije o varijable, metode i konstruktore klase, moramo stvoriti objekt klase.

Metode korištene u 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;
		}
	}
  • Sljedeći primjer pokazuje različite načine stvaranja objekta klase “class”:
  • Primjer 1: Kako dobiti metapodatke klase

    Sljedeći primjer pokazuje kako dobiti metapodatke kao što su: naziv klase, naziv super klase, implementirana sučelja i modifikatori pristupa klasi.

    Dobit ćemo metapodatke donje klase pod nazivom Guru99Base.class:

    Dohvati metapodatke klase

    import java.io.Serializable;
    public abstract class Guru99Base implements Serializable,Cloneable {
    }
    
    1. Naziv klase je: Guru99Base
    2. Njegovi modifikatori pristupa su: javni i apstraktni
    3. Ima implementirana sučelja: Serializable i Cloneable
    4. Budući da nije eksplicitno proširio niti jednu klasu, njegova super klasa je: java.lang.Object

    Donja klasa će dobiti meta podatke Guru99Base.class i ispisati ih:

    Dohvati metapodatke klase

    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. ispišite naziv klase koristeći getName metodu
    2. Ispišite naziv super klase pomoću metode getSuperClass().getName().
    3. Ispiši naziv implementiranih sučelja
    4. Ispišite modifikatore pristupa koje koristi klasa

    Dohvati metapodatke klase

    Dohvati metapodatke klase

    Primjer 2: Kako dobiti metapodatke varijable

    Sljedeći primjeri pokazuju kako dobiti metapodatke varijable:

    Ovdje stvaramo klasu pod nazivom Guru99VariableMetaData .class s nekim varijablama:

    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";    
    }	
    
    Koraci za dobivanje metapodataka o varijablama u gornjoj klasi:
    1. Stvorite objekt klase gornje klase, tj. Guru99VariableMetaData.class kao ispod:
        Guru99VariableMetaData  guru99ClassVar  = new Guru99VariableMetaData();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
    2. Dobijte metapodatke u obliku niza polja pomoću getFields() or getDeclaredFields() metode kao u nastavku:
      Field[]  guru99Field1= guru99ClassObjVar .getFields();
      Field[]  guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    getFields() metoda vraća metapodatke javne varijable iz navedene klase kao i iz njene super klase.

    getDeclaredFields() metoda vraća metapodatke svih varijabli samo iz navedene klase.

    1. Dohvatite nazive varijabli koristeći metodu “javni String getName()”.
    2. Dohvatite vrstu podataka varijabli pomoću metode "javne klase getType()".
    3. Dohvatite vrijednost varijable pomoću metode "javno xxx get (polje)".

      Ovdje xxx može biti bajt ili skraćenica od bilo koje vrste vrijednosti koju želimo dohvatiti.

    4. Dohvatite modifikatore pristupa varijabli pomoću metoda getModifier() i Modifier.toString(int i).

      Ovdje pišemo klasu za dobivanje metapodataka varijabli prisutnih u klasi Guru99VariableMetaData .class:

      Dohvati metapodatke varijable

      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. Stvoren objekt klase za Guru99VariableMetaData.class
      2. Dobio sam sve metapodatke varijabli u nizu polja
      3. Ispisana sva imena varijabli u klasi Guru99VariableMetaData.class
      4. Ispisani su svi tipovi podataka varijabli u klasi Guru99VariableMetaData.class
      5. Ispisani su svi modifikatori pristupa varijabli u klasi Guru99VariableMetaData.class
      6. Ispisane vrijednosti svih varijabli u Ispisani su svi tipovi podataka varijabli u klasi Guru99VariableMetaData.class

      Dohvati metapodatke metode

      Dohvati metapodatke metode

      Primjer 3: Kako dobiti metapodatke metode

      Sljedeći primjeri pokazuju kako dobiti metapodatke metode:

      Ovdje stvaramo klasu pod nazivom Guru99MethodMetaData .class s nekim metodama

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

      Koraci za dobivanje metapodataka o metodama u gornjoj klasi:

      1. Stvorite objekt klase gornje klase, tj. Guru99MethodMetaData.class kao ispod:
        Guru99MethodMetaData  guru99ClassVar  = new Guru99MethodMetaData  ();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
      2. Dohvatite informacije o metodi u polju Method pomoću metode getMethods() i getDeclaredMethods() kao u nastavku:
        Method[]  guru99 Method 1= guru99ClassObjVar .get Methods();
        Method []  guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        getMethods() metoda vraća metapodatke javnih metoda iz navedene klase kao i iz svoje super klase.

        getDeclaredMethods() metoda vraća metapodatke svih metoda samo iz navedene klase.

      3. Dobijte naziv metode pomoću getName () metoda.
      4. Dobijte vrstu povrata metode koja koristi getReturnType() metoda.
      5. Dobijte modifikatore pristupa metodama koje koristite getModifiers() i Modifiers.toString(int i) metode.
      6. Dohvatite vrste parametara metode pomoću getParameterTypes() metoda koja vraća niz klasa.
      7. Dobiti iznimku pomoću getExceptionTypes() metoda koja vraća niz klasa.

      Ovdje pišemo klasu za dobivanje metapodataka metoda prisutnih u klasi Guru99MethodMetaData.class:

      Dohvati metapodatke 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. Stvoren objekt klase za Guru99MethodMetaData.class
      2. Dobio sam sve metapodatke svih metoda u nizu metoda
      3. Ispisana su sva imena metoda prisutna u klasi Guru99MethodMetaData.class
      4. Ispisani povratni tipovi metoda u klasi Guru99MethodMetaData.class
      5. Ispisani su svi modifikatori pristupa metodama u klasi Guru99MethodMetaData.class
      6. Ispisani tipovi parametara metoda u Guru99MethodMetaData.class
      7. Ispisane iznimke izbacuju metode u Guru99MethodMetaData.class

        Dohvati metapodatke metode

      Dohvati metapodatke metode

      Primjer 4: Kako dobiti metapodatke konstruktora

      Sljedeći primjeri pokazuju kako doći do metapodataka konstruktora:

      Ovdje stvaramo klasu pod nazivom Guru99Constructor.class s različitim konstruktorima:

      Dobivanje metapodataka konstruktora

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

      Ovdje pišemo klasu kako bismo dobili metapodatke konstruktora prisutnih u klasi Guru99Constructor.class:

      Dobivanje metapodataka konstruktora

      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. Stvoren objekt klase za Guru99Constructor.class
      2. Dobio sam sve metapodatke svih konstruktora u nizu konstruktora
      3. Ispisuje sva imena konstruktora prisutna u klasi Guru99Constructor.class
      4. Ispisani su svi modifikatori pristupa konstruktora u klasi Guru99Constructor.class
      5. Ispisani tipovi parametara konstruktora u Guru99Constructor.class
      6. Ispisane iznimke izbacuju konstruktori u Guru99Constructor.class

      Dobivanje metapodataka konstruktora

      Dobivanje metapodataka konstruktora

      rezime

      • Refleksijsko programiranje u Javi pomaže u dohvaćanju i modificiranju informacija o klasama i članovima klase kao što su varijable, metode, konstruktori.
      • Reflection API u Java može se implementirati korištenjem klasa u paketu java.lang.reflect i metodama klase java.lang.Class.
      • Neke najčešće korištene metode klase java.lang.Class su getName (), getSuperclass (), getInterfaces (), getModifiers () itd.
      • Neke najčešće korištene klase u paketu java.lang.reflect su Polje, Metoda, Konstruktor, Modifikator itd.
      • Reflection API može pristupiti privatnim metodama i varijablama klase koje bi mogle biti sigurnosna prijetnja.
      • Reflection API moćna je mogućnost koju pruža Java, ali dolazi s nekim troškovima kao što su sporije performanse, sigurnosna ranjivost i problem s dozvolama. Stoga API refleksije treba tretirati kao posljednje sredstvo za izvođenje operacije.