Java Výukový program Reflection API s příkladem

V čem je Reflection in Java?

Java Reflexe je proces analýzy a úpravy všech schopností třídy za běhu. Reflection API v Java se používá k manipulaci s třídou a jejími členy, které zahrnují pole, metody, konstruktor atd. za běhu.

Jedna výhoda reflexního API v Java to znamená, že může manipulovat i se soukromými členy třídy.

Balíček java.lang.reflect poskytuje mnoho tříd pro implementaci reflexe java. Metody třídy java.lang.Class se používají ke shromažďování úplných metadat konkrétní třídy.

Třída v balíčku java.lang.reflect

Následuje seznam různý Java třídy v balíku java.lang.package k implementaci reflexe-

  • Pole: Tato třída se používá ke shromažďování deklarativních informací, jako je datový typ, modifikátor přístupu, název a hodnota proměnné.
  • Metoda: Tato třída se používá ke shromažďování deklarativních informací, jako je modifikátor přístupu, návratový typ, název, typy parametrů a typ výjimky metody.
  • Stavitel: Tato třída se používá ke shromažďování deklarativních informací, jako je modifikátor přístupu, název a typy parametrů konstruktoru.
  • změna: Tato třída se používá ke shromažďování informací o konkrétním modifikátoru přístupu.

Metody používané v java.lang.Class

  • Veřejný řetězec getName (): Vrátí název třídy.
  • veřejná třída getSuperclass(): Vrátí odkaz na supertřídu
  • Public Class[] getInterfaces() : Vrátí pole rozhraní implementovaných zadanou třídou
  • Veřejné v getModifiers (): Vrátí celočíselnou hodnotu představující modifikátory zadané třídy, kterou je třeba předat jako parametr do „public static String toString (int i)” metoda, která vrací specifikátor přístupu pro danou třídu.

Jak získat úplné informace o třídě

Chcete-li získat informace o proměnné, metod a konstruktorů třídy, musíme vytvořit objekt třídy.

Metody používané v 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;
		}
	}
  • Následující příklad ukazuje různé způsoby, jak vytvořit objekt třídy „class“ :
  • Příklad 1: Jak získat metadata třídy

    Následující příklad ukazuje, jak získat metadata, jako jsou: Název třídy, název nadtřídy, implementovaná rozhraní a modifikátory přístupu třídy.

    Získáme metadata níže uvedené třídy s názvem Guru99Base.class:

    Získejte metadata třídy

    import java.io.Serializable;
    public abstract class Guru99Base implements Serializable,Cloneable {
    }
    
    1. Název třídy je: Guru99Base
    2. Jeho modifikátory přístupu jsou: public a abstract
    3. Má implementovaná rozhraní: Serializovatelné a klonovatelné
    4. Protože explicitně nerozšířil žádnou třídu, je to super třída: java.lang.Object

    Níže uvedená třída získá metadata Guru99Base.class a vytiskne je:

    Získejte metadata třídy

    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. vytiskněte název třídy pomocí metody getName
    2. Vytiskněte název supertřídy pomocí metody getSuperClass().getName().
    3. Vytiskněte název implementovaných rozhraní
    4. Vytiskněte modifikátory přístupu používané třídou

    Získejte metadata třídy

    Získejte metadata třídy

    Příklad 2: Jak získat metadata proměnné

    Následující příklady ukazují, jak získat metadata proměnné:

    Zde vytváříme třídu s názvem Guru99VariableMetaData .class s několika proměnnými:

    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";    
    }	
    
    Kroky k získání metadat o proměnných ve výše uvedené třídě:
    1. Vytvořte objekt třídy výše uvedené třídy, tj. Guru99VariableMetaData.class, jak je uvedeno níže:
        Guru99VariableMetaData  guru99ClassVar  = new Guru99VariableMetaData();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
    2. Získejte metadata ve formě pole pole pomocí getFields() or getDeclaredFields() způsoby, jak je uvedeno níže:
      Field[]  guru99Field1= guru99ClassObjVar .getFields();
      Field[]  guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    getFields() metoda vrací metadata veřejné proměnné ze zadané třídy i z její nadtřídy.

    getDeclaredFields() metoda vrací metadata všech proměnných pouze ze zadané třídy.

    1. Získejte názvy proměnných pomocí metody „public String getName()“.
    2. Získejte datový typ proměnných pomocí metody „public Class getType()“.
    3. Získejte hodnotu proměnné pomocí metody „public xxx get (Field)“.

      Zde může být xxx bajt nebo krátký bajt jakéhokoli typu hodnoty, kterou chceme načíst.

    4. Získejte modifikátory přístupu proměnných pomocí metod getModifier() a Modifier.toString(int i).

      Zde píšeme třídu, abychom získali metadata proměnných přítomných ve třídě Guru99VariableMetaData .class:

      Získejte metadata proměnné

      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. Vytvořen objekt třídy pro Guru99VariableMetaData.class
      2. Získal všechna metadata proměnných v poli Field
      3. Vytištěny všechny názvy proměnných ve třídě Guru99VariableMetaData.class
      4. Vytištěny všechny datové typy proměnných ve třídě Guru99VariableMetaData.class
      5. Vytištěny všechny modifikátory přístupu proměnných ve třídě Guru99VariableMetaData.class
      6. Vytištěné hodnoty všech proměnných v Vytištěné všechny datové typy proměnných ve třídě Guru99VariableMetaData.class

      Získejte metadata metody

      Získejte metadata metody

      Příklad 3: Jak získat metadata metody

      Následující příklady ukazují, jak získat metadata metody:

      Zde vytváříme třídu s názvem Guru99MethodMetaData .class s některými metodami

      Získejte metadata metody

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

      Kroky k získání metadat o metodách ve výše uvedené třídě:

      1. Vytvořte objekt třídy výše uvedené třídy, tj. Guru99MethodMetaData.class, jak je uvedeno níže:
        Guru99MethodMetaData  guru99ClassVar  = new Guru99MethodMetaData  ();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
      2. Získejte informace o metodě v poli Method pomocí metody getMethods() a getDeclaredMethods(), jak je uvedeno níže:
        Method[]  guru99 Method 1= guru99ClassObjVar .get Methods();
        Method []  guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        getMethods() metoda vrací metadata veřejných metod ze zadané třídy i z její nadtřídy.

        getDeclaredMethods() metoda vrací pouze metadata všech metod ze zadané třídy.

      3. Získejte název metody pomocí getName () metoda.
      4. Získejte návratový typ metody pomocí getReturnType() metoda.
      5. Získejte modifikátory přístupu používaných metod getModifiers() si Modifiers.toString(int i) metody.
      6. Získejte typy parametrů metody pomocí getParameterTypes() metoda, která vrací pole tříd.
      7. Získejte vyvolání výjimky pomocí getExceptionTypes() metoda, která vrací pole tříd.

      Zde píšeme třídu, abychom získali metadata metod přítomných ve třídě Guru99MethodMetaData.class:

      Získejte metadata metody

      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. Vytvořen objekt třídy pro Guru99MethodMetaData.class
      2. Získal všechna metadata všech metod v poli Method
      3. Vytištěny všechny názvy metod přítomné ve třídě Guru99MethodMetaData.class
      4. Vytištěné návratové typy metod ve třídě Guru99MethodMetaData.class
      5. Vytištěny všechny modifikátory přístupu metod ve třídě Guru99MethodMetaData.class
      6. Tištěné typy parametrů metod v Guru99MethodMetaData.class
      7. Tištěné výjimky jsou vyvolány metodami v Guru99MethodMetaData.class

        Získejte metadata metody

      Získejte metadata metody

      Příklad 4: Jak získat metadata konstruktorů

      Následující příklady ukazují, jak získat metadata konstruktorů:

      Zde vytváříme třídu s názvem Guru99Constructor.class s různými konstruktory:

      Získejte metadata konstruktorů

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

      Zde píšeme třídu, abychom získali metadata konstruktorů přítomných ve třídě Guru99Constructor.class:

      Získejte metadata konstruktorů

      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. Vytvořen objekt třídy pro Guru99Constructor.class
      2. Získal všechna metadata všech konstruktorů v poli konstruktoru
      3. Vytištěna všechna jména konstruktorů přítomná ve třídě Guru99Constructor.class
      4. Vytištěny všechny modifikátory přístupu konstruktorů ve třídě Guru99Constructor.class
      5. Vytištěné typy parametrů konstruktorů v Guru99Constructor.class
      6. Tištěné výjimky jsou vyvolány konstruktory v Guru99Constructor.class

      Získejte metadata konstruktorů

      Získejte metadata konstruktorů

      Shrnutí

      • Programování reflexe v jazyce Java pomáhá při získávání a úpravě informací o třídách a členech tříd, jako jsou proměnné, metody, konstruktory.
      • Reflection API v Java lze implementovat pomocí tříd v balíčku java.lang.reflect a metod třídy java.lang.Class.
      • Některé běžně používané metody třídy java.lang.Class jsou getName (), getSuperclass (), getInterfaces (), getModifiers () atd.
      • Některé běžně používané třídy v balíčku java.lang.reflect jsou Field, Method, Constructor, Modifier atd.
      • Reflection API může přistupovat k soukromým metodám a proměnným třídy, které by mohly představovat bezpečnostní hrozbu.
      • Reflection API je výkonná funkce, kterou poskytuje Java, ale přichází s některými režijními náklady, jako je pomalejší výkon, zranitelnost zabezpečení a problém s oprávněními. Proto by reflexní API mělo být považováno za poslední možnost provedení operace.