Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Java

Java Reflection API-zelfstudie met voorbeeld


Wat is reflectie in Java?

Java Reflection is het proces van het analyseren en wijzigen van alle mogelijkheden van een klasse tijdens runtime. Reflection API in Java wordt gebruikt om klasse en zijn leden te manipuleren, waaronder velden, methoden, constructor, enz. tijdens runtime.

Een voordeel van de reflectie-API in Java is dat het ook privéleden van de klas kan manipuleren.

Het pakket java.lang.reflect biedt veel klassen om reflectie java te implementeren.Methods van de klasse java.lang.Class worden gebruikt om de volledige metadata van een bepaalde klasse te verzamelen.

In deze tutorial leer je-

  • Wat is reflectie
  • Klasse in java.lang.reflect-pakket
  • Methoden gebruikt in java.lang.Class
  • Hoe krijg ik volledige informatie over een klas
  • Voorbeeld 1:Hoe krijg ik metadata van klasse
  • Voorbeeld 2:Hoe metadata van variabelen te verkrijgen
  • Voorbeeld 3:Hoe krijg ik metadata van methode
  • Voorbeeld 4:Hoe krijg ik metadata van constructeurs

Klasse in java.lang.reflect-pakket

Hieronder volgt een lijst van verschillende Java-klassen in java.lang.package om reflectie te implementeren-

  • Veld :Deze klasse wordt gebruikt om declaratieve informatie te verzamelen, zoals datatype, toegangsmodificator, naam en waarde van een variabele.
  • Methode :Deze klasse wordt gebruikt om declaratieve informatie te verzamelen, zoals toegangsmodifier, retourtype, naam, parametertypes en uitzonderingstype van een methode.
  • Constructeur :Deze klasse wordt gebruikt om declaratieve informatie te verzamelen, zoals toegangsmodifier, naam en parametertypes van een constructor.
  • Modificatie :Deze klasse wordt gebruikt om informatie te verzamelen over een bepaalde toegangsmodifier.

Methoden gebruikt in java.lang.Class

  • Openbare tekenreeks getName () :Retourneert de naam van de klas.
  • openbare klasse getSuperclass() :Retourneert de superklassereferentie
  • Openbare klasse[] getInterfaces() :Retourneert een array van interfaces geïmplementeerd door de opgegeven klasse
  • Openbaar in getModifiers (): Retourneert een geheel getal dat de modifiers van de opgegeven klasse vertegenwoordigt die als parameter moet worden doorgegeven aan "public static String toString (int i )" methode die de toegangsspecificatie voor de gegeven klasse retourneert.

Hoe krijg ik volledige informatie over een klas

Om informatie te krijgen over variabelen, methoden en constructors van een klasse, moeten we een object van de klasse maken.

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;
		}
	}
  • Het volgende voorbeeld toont verschillende manieren om een ​​object van klasse "class" te maken:
  • Voorbeeld 1:Hoe krijg ik metadata van klasse

    Het volgende voorbeeld laat zien hoe u metadata kunt verkrijgen, zoals:klassenaam, superklassenaam, geïmplementeerde interfaces en toegangsmodifiers van een klasse.

    We krijgen de metadata van de onderstaande klasse genaamd Guru99Base.class:

    import java.io.Serializable;
    public abstract class Guru99Base implements Serializable,Cloneable {
    }
    
    1. Naam van de klas is:Guru99Base
    2. De toegangsmodifiers zijn:openbaar en abstract
    3. Het heeft interfaces geïmplementeerd:Serializable en Cloneable
    4. Omdat het geen enkele klasse expliciet heeft uitgebreid, is de superklasse:java.lang.Object

    De onderstaande klasse haalt de metagegevens van Guru99Base.class op en drukt deze af:

    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. druk de naam van de klasse af met de methode getName
    2. Druk de naam van de superklasse af met de methode getSuperClass().getName()
    3. Druk de naam van de geïmplementeerde interfaces af
    4. Druk de toegangsmodifiers af die door de klas worden gebruikt

    Voorbeeld 2:Hoe krijg ik metadata van variabelen

    De volgende voorbeelden laten zien hoe u metadata van een variabele kunt krijgen:

    Hier maken we een klasse met de naam Guru99VariableMetaData .class met enkele variabelen:

    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";    
    }	
    
    Stappen om de metadata over de variabelen in de bovenstaande klasse te verkrijgen:
    1. Maak het klasseobject van de bovenstaande klasse, d.w.z. Guru99VariableMetaData.class zoals hieronder:
        Guru99VariableMetaData  guru99ClassVar  = new Guru99VariableMetaData();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
    2. Verkrijg de metadata in de vorm van een veldarray met getFields() of getDeclaredFields() methoden zoals hieronder:
      Field[]  guru99Field1= guru99ClassObjVar .getFields();
      Field[]  guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    getFields() methode retourneert metadata van de openbare variabele van de opgegeven klasse en van zijn superklasse.

    getDeclaredFields() methode retourneert alleen metadata van alle variabelen van de opgegeven klasse.

    1. Verkrijg de naam van de variabelen met de methode "public String getName()".
    2. Verkrijg het datatype van de variabelen met de methode “public Class getType()”.
    3. Verkrijg de waarde van de variabele met de methode "public xxx get (Field)".

      Hier kan xxx een byte of kort zijn van elk type waarde dat we willen ophalen.

    4. Verkrijg de toegangsmodifiers van de variabelen met behulp van getModifier() en Modifier.toString(int i) methoden.

      Hier schrijven we een klasse om de metadata te krijgen van de variabelen die aanwezig zijn in de klasse Guru99VariableMetaData .class:

      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. Klasse-object gemaakt voor Guru99VariableMetaData.class
      2. Heb alle metadata van de variabelen in een veldarray
      3. Alle variabelennamen in de klasse Guru99VariableMetaData.class afgedrukt
      4. Alle gegevenstypen van de variabelen in de klasse Guru99VariableMetaData.class afgedrukt
      5. Alle toegangsmodifiers van de variabelen in de klasse Guru99VariableMetaData.class afgedrukt
      6. Gedrukte waarden van alle variabelen in Alle gegevenstypen van de variabelen in de klasse Guru99VariableMetaData.class afgedrukt

      Voorbeeld 3:Hoe krijg ik metadata van methode

      De volgende voorbeelden laten zien hoe u metadata van een methode kunt krijgen:

      Hier maken we een klasse met de naam Guru99MethodMetaData .class met enkele methoden

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

      Stappen om de metadata over de methoden in de bovenstaande klasse te verkrijgen:

      1. Maak het klasseobject van de bovenstaande klasse, d.w.z. Guru99MethodMetaData.class zoals hieronder:
        Guru99MethodMetaData  guru99ClassVar  = new Guru99MethodMetaData  ();
        Class  guru99ClassObjVar  = guru99ClassVar.getClass();
      2. Verkrijg methode-informatie in een Method-array met behulp van getMethods() en getDeclaredMethods() methode zoals hieronder:
        Method[]  guru99 Method 1= guru99ClassObjVar .get Methods();
        Method []  guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        getMethods() methode retourneert metadata van de openbare methoden van de opgegeven klasse en van zijn superklasse.

        getDeclaredMethods() methode retourneert alleen metadata van alle methoden van de opgegeven klasse.

      3. Haal de naam van de methode op met getName() methode.
      4. Verkrijg het retourtype van de methode met getReturnType() methode.
      5. Verkrijg toegangsmodifiers van de methoden met getModifiers() en Modifiers.toString(int i) methoden.
      6. Verkrijg methodeparametertypes met behulp van getParameterTypes() methode die een klasse-array retourneert.
      7. Ontvang uitzondering met getExceptionTypes() methode die een klasse-array retourneert.

      Hier zijn we een klasse aan het schrijven om de metadata te krijgen van de methoden die aanwezig zijn in de klasse Guru99MethodMetaData.class:

      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. Klasobject gemaakt voor Guru99MethodMetaData.class
      2. Heb alle metadata van alle methoden in een Method-array
      3. Alle methodenamen afgedrukt die aanwezig zijn in de klasse Guru99MethodMetaData.class
      4. Gedrukte retourtypen van de methoden in de klasse Guru99MethodMetaData.class
      5. Alle toegangsmodifiers van de methoden in de klasse Guru99MethodMetaData.class afgedrukt
      6. Gedrukte parametertypen van de methoden in Guru99MethodMetaData.class
      7. Afgedrukte uitzonderingen worden gegenereerd door methoden in Guru99MethodMetaData.class

      Voorbeeld 4:Hoe krijg ik metadata van constructeurs

      De volgende voorbeelden laten zien hoe u metadata van constructeurs kunt krijgen:

      Hier maken we een klasse met de naam Guru99Constructor.class met verschillende constructors:

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

      Hier zijn we een klasse aan het schrijven om de metadata te krijgen van de constructors die aanwezig zijn in de klasse Guru99Constructor.class:

      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. Klasobject gemaakt voor Guru99Constructor.class
      2. Heb alle metadata van alle constructors in een Constructor-array
      3. Alle namen van de constructeurs afgedrukt die aanwezig zijn in de klasse Guru99Constructor.class
      4. Alle toegangsmodifiers van de constructors in de klasse Guru99Constructor.class afgedrukt
      5. Gedrukte parametertypes van de constructors in Guru99Constructor.class
      6. Afgedrukte uitzonderingen worden gegenereerd door constructeurs in Guru99Constructor.class

      Samenvatting:

      • Reflectieprogrammering in Java helpt bij het ophalen en wijzigen van informatie over klassen en klassenleden, zoals variabelen, methoden en constructors.
      • Reflection API in Java kan worden geïmplementeerd met klassen in het pakket java.lang.reflect en methoden van de klasse java.lang.Class.
      • Enkele veelgebruikte methoden van de klasse java.lang.Class zijn getName (), getSuperclass (), getInterfaces (), getModifiers () enz.
      • Enkele veelgebruikte klassen in het pakket java.lang.reflect zijn Field, Method, Constructor, Modifier, enz.
      • Reflection API heeft toegang tot privémethoden en variabelen van een klasse die een beveiligingsrisico kunnen vormen.
      • Reflection API is een krachtige mogelijkheid die door Java wordt geboden, maar het gaat gepaard met enkele overheadkosten, zoals tragere prestaties, kwetsbaarheid in de beveiliging en toestemmingsproblemen. Daarom moet de reflectie-API worden behandeld als het laatste redmiddel om een ​​bewerking uit te voeren.

    Java

    1. Java anonieme klasse
    2. Java-reflectie
    3. Java ObjectInputStream-klasse
    4. Java ObjectOutputStream-klasse
    5. C++ klasse en object met voorbeeld
    6. C# Class &Object Tutorial met voorbeelden
    7. C# Abstract Class-zelfstudie met voorbeeld:wat is abstractie?
    8. Java String charAt() Methode met Voorbeeld
    9. Java String endsWith() Methode met voorbeeld
    10. Java BufferedReader:hoe een bestand in Java te lezen met voorbeeld
    11. Invoegsorteeralgoritme in Java met programmavoorbeeld