Java Reflection API -opastus ja esimerkki

Mitä on heijastus Java?

Java Reflection on prosessi, jossa analysoidaan ja muokataan kaikkia luokan ominaisuuksia ajon aikana. Reflection API sisään Java käytetään manipuloimaan luokkaa ja sen jäseniä, jotka sisältävät kenttiä, menetelmiä, konstruktoria jne. ajon aikana.

Yksi heijastussovellusliittymän etu Java Se voi manipuloida myös luokan yksityisiä jäseniä.

Paketti java.lang.reflect tarjoaa monia luokkia heijastuksen toteuttamiseen java.Java.lang.Class-luokan menetelmät käytetään keräämään tietyn luokan täydelliset metatiedot.

Luokka java.lang.reflect-paketissa

Seuraavassa on luettelo eri Java luokat java.lang.packagessa reflektoinnin toteuttamiseksi-

  • Kenttä: Tätä luokkaa käytetään määrittämään ilmoittavia tietoja, kuten tietotyyppi, käyttöoikeusmuuttaja, muuttujan nimi ja arvo.
  • Menetelmä: Tätä luokkaa käytetään keräämään deklaratiivisia tietoja, kuten käyttöoikeusmuunnin, palautustyyppi, nimi, parametrityypit ja menetelmän poikkeustyyppi.
  • Rakentaja: Tätä luokkaa käytetään määrittämään ilmoittavia tietoja, kuten pääsyn muokkaaja, rakentajan nimi ja parametrityypit.
  • muutos: Tätä luokkaa käytetään keräämään tietoja tietystä pääsyn muokkaajasta.

Java.lang.Classissa käytetyt menetelmät

  • Julkinen merkkijono getName (): Palauttaa luokan nimen.
  • julkinen luokka getSuperclass(): Palauttaa superluokan viittauksen
  • Julkinen luokka[] getInterfaces() : Palauttaa määritetyn luokan toteuttamien liitäntöjen joukon
  • Julkinen getModifiersissa (): Palauttaa kokonaisluvun, joka edustaa määritetyn luokan modifioijia, joka on välitettävä parametrina "julkinen staattinen merkkijono merkkijonoon (int i )" menetelmä, joka palauttaa pääsyn määritteen tietylle luokalle.

Kuinka saada täydelliset tiedot luokasta

Saadaksesi tietoa aiheesta muuttujat, menetelmät ja luokan rakentajat, meidän on luotava luokan objekti.

Java.lang.Classissa käytetyt menetelmät

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;
		}
	}
  • Seuraava esimerkki näyttää erilaisia ​​tapoja luoda luokan "class" objekti:
  • Esimerkki 1: Luokan metatietojen hankkiminen

    Seuraava esimerkki näyttää, kuinka saada metatietoja, kuten: Luokan nimi, superluokan nimi, toteutetut rajapinnat ja luokan käyttöoikeusmuuntimet.

    Saamme metatiedot alla olevasta luokasta nimeltä Guru99Base.class:

    Hanki luokan metatiedot

    import java.io.Serializable;
    public abstract class Guru99Base implements Serializable,Cloneable {
    }
    
    1. Kurssin nimi on: Guru99Base
    2. Sen käyttöoikeudet ovat: julkinen ja abstrakti
    3. Se on toteuttanut käyttöliittymät: Serialisable ja Cloneable
    4. Koska se ei ole laajentanut mitään luokkaa nimenomaisesti, sen superluokka on: java.lang.Object

    Alla oleva luokka saa Guru99Base.classin metatiedot ja tulostaa ne:

    Hanki luokan metatiedot

    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. tulosta luokan nimi käyttämällä getName-menetelmää
    2. Tulosta superluokan nimi käyttämällä getSuperClass().getName()-metodia
    3. Tulosta toteutettujen rajapintojen nimet
    4. Tulosta luokan käyttämät käyttöoikeudet

    Hanki luokan metatiedot

    Hanki luokan metatiedot

    Esimerkki 2: Kuinka saada muuttujan metatiedot

    Seuraavat esimerkit osoittavat, kuinka saada muuttujan metatiedot:

    Täällä luomme luokan nimeltä Guru99VariableMetaData .class, jossa on joitain muuttujia:

    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";    
    }	
    
    Vaiheet yllä olevan luokan muuttujien metatietojen saamiseksi:
    1. Luo yllä olevan luokan eli Guru99VariableMetaData.class luokkaobjekti seuraavasti:
        Guru99VariableMetaData  guru99ClassVar  = new Guru99VariableMetaData();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
    2. Hanki metatiedot kenttätaulukon muodossa käyttämällä getFields() or getDeclaredFields() alla olevat menetelmät:
      Field[]  guru99Field1= guru99ClassObjVar .getFields();
      Field[]  guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    getFields() menetelmä palauttaa julkisen muuttujan metatiedot määritetystä luokasta sekä sen superluokasta.

    getDeclaredFields() Metodi palauttaa vain määritetyn luokan kaikkien muuttujien metatiedot.

    1. Hanki muuttujien nimet käyttämällä "public String getName()" -menetelmää.
    2. Hanki muuttujien tietotyypit käyttämällä "public Class getType()" -menetelmää.
    3. Hanki muuttujan arvo käyttämällä "public xxx get (Field)" -menetelmää.

      Tässä xxx voi olla tavu tai lyhyt minkä tahansa tyyppisestä arvosta, jonka haluamme noutaa.

    4. Hanki muuttujien käyttöoikeusmuuntimet käyttämällä getModifier()- ja Modifier.toString(int i) -menetelmiä.

      Tässä kirjoitamme luokkaa saadaksemme luokassa Guru99VariableMetaData .class olevien muuttujien metatiedot:

      Hanki muuttujan metatiedot

      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. Luotu luokkaobjekti Guru99VariableMetaData.classille
      2. Sain kaikki muuttujien metatiedot kenttätaulukossa
      3. Tulostettu kaikki luokan Guru99VariableMetaData.class muuttujien nimet
      4. Tulostettu kaikki luokan Guru99VariableMetaData.class muuttujien tietotyypit
      5. Tulosti kaikki luokan Guru99VariableMetaData.class muuttujien pääsyoikeudet
      6. Kaikkien muuttujien tulostetut arvot luokkaan Tulostettu kaikki luokan Guru99VariableMetaData.class muuttujien tietotyypit

      Hanki menetelmän metatiedot

      Hanki menetelmän metatiedot

      Esimerkki 3: Kuinka saada menetelmän metatiedot

      Seuraavat esimerkit osoittavat, kuinka menetelmän metatiedot saadaan:

      Täällä luomme luokkaa nimeltä Guru99MethodMetaData .class joillakin menetelmillä

      Hanki menetelmän metatiedot

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

      Vaiheet yllä olevan luokan menetelmien metatietojen saamiseksi:

      1. Luo yllä olevan luokan eli Guru99MethodMetaData.class luokkaobjekti seuraavasti:
        Guru99MethodMetaData  guru99ClassVar  = new Guru99MethodMetaData  ();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
      2. Hanki menetelmätiedot Method-taulukossa käyttämällä getMethods()- ja getDeclaredMethods()-metodeja seuraavasti:
        Method[]  guru99 Method 1= guru99ClassObjVar .get Methods();
        Method []  guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        getMethods() metodi palauttaa julkisten menetelmien metatiedot määritetystä luokasta sekä sen superluokasta.

        getDeclaredMethods() Metodi palauttaa vain määritetyn luokan kaikkien menetelmien metatiedot.

      3. Hanki menetelmän nimi käyttämällä getName () menetelmällä.
      4. Hanki menetelmän palautustyyppi käyttämällä getReturnType() menetelmällä.
      5. Hanki menetelmien käyttöoikeudet getModifiers() ja Modifiers.toString(int i) menetelmiä.
      6. Hanki menetelmäparametrityypit käyttämällä getParameterTypes() menetelmä, joka palauttaa luokkataulukon.
      7. Saat heitetty poikkeus käyttämällä getExceptionTypes() menetelmä, joka palauttaa luokkataulukon.

      Täällä kirjoitamme luokkaa saadaksemme luokassa Guru99MethodMetaData.class olevien menetelmien metatiedot:

      Hanki menetelmän metatiedot

      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. Luotu luokkaobjekti Guru99MethodMetaData.classille
      2. Sain kaikki metatiedot kaikista menetelmistä Method-taulukossa
      3. Tulostettiin kaikki luokassa Guru99MethodMetaData.class olevat menetelmänimet
      4. Luokan Guru99MethodMetaData.class metodien tulostetut palautustyypit
      5. Tulostettu kaikki luokan Guru99MethodMetaData.class menetelmien pääsymääritykset
      6. Guru99MethodMetaData.classin menetelmien tulostetut parametrityypit
      7. Tulostetut poikkeukset heitetään Guru99MethodMetaData.classin menetelmillä

        Hanki menetelmän metatiedot

      Hanki menetelmän metatiedot

      Esimerkki 4: Kuinka saada rakentajien metatiedot

      Seuraavat esimerkit osoittavat, kuinka rakentajien metatiedot saadaan:

      Täällä luomme Guru99Constructor.class-nimisen luokan eri rakentajilla:

       Hanki rakentajien metatiedot

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

      Tässä kirjoitamme luokkaa saadaksemme luokassa Guru99Constructor.class olevien rakentajien metatiedot:

      Hanki rakentajien metatiedot

      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. Luotu luokkaobjekti Guru99Constructor.classille
      2. Sain kaikki metatiedot kaikista rakentajista Constructor-taulukossa
      3. Tulostettu kaikki luokassa Guru99Constructor.class olevat rakentajien nimet
      4. Tulostettu kaikki luokan Guru99Constructor.class rakentajien pääsymääritykset
      5. Guru99Constructor.class konstruktorien tulostetut parametrityypit
      6. Guru99Constructor.classin rakentajat heittävät painettuja poikkeuksia

      Hanki rakentajien metatiedot

      Hanki rakentajien metatiedot

      Yhteenveto

      • Javan heijastusohjelmointi auttaa hakemaan ja muokkaamaan tietoa luokista ja luokan jäsenistä, kuten muuttujista, menetelmistä, rakentajista.
      • Reflection API sisään Java voidaan toteuttaa käyttämällä java.lang.reflect-paketin luokkia ja java.lang.Class-luokan menetelmiä.
      • Joitakin yleisesti käytettyjä java.lang.Class-luokan menetelmiä ovat getName (), getSuperclass (), getInterfaces (), getModifiers () jne.
      • Jotkut java.lang.reflect-paketin yleisesti käytetyt luokat ovat Field, Method, Constructor, Modifier jne.
      • Reflection API voi käyttää luokan yksityisiä menetelmiä ja muuttujia, jotka voivat olla turvallisuusuhka.
      • Reflection API on tehokas ominaisuus Java, mutta siihen liittyy joitain yleiskustannuksia, kuten hitaampi suorituskyky, tietoturvahaavoittuvuus ja lupaongelma. Tästä syystä heijastussovellusliittymää tulisi käsitellä viimeisenä keinona suorittaa toiminto.

    Tiivistä tämä viesti seuraavasti: