Was ist Reflexion in Java?
Java Reflection ist der Prozess zum Analysieren und Ändern aller Funktionen einer Klasse zur Laufzeit. Die Reflection-API in Java wird verwendet, um die Klasse und ihre Mitglieder zu bearbeiten, die zur Laufzeit Felder, Methoden, Konstruktoren usw. enthalten.
Ein Vorteil der Reflection API in Java ist, dass sie auch private Mitglieder der Klasse manipulieren kann.
Das Paket java.lang.reflect bietet viele Klassen zum Implementieren der Reflektion. Java.Methods der Klasse java.lang.Class wird verwendet, um die vollständigen Metadaten einer bestimmten Klasse zu erfassen.
In diesem Tutorial lernen Sie:
- Was ist Reflexion?
- Klasse im Paket java.lang.reflect
- In java.lang.Class verwendete Methoden
- So erhalten Sie vollständige Informationen zu einer Klasse
- Beispiel 1: So erhalten Sie Metadaten der Klasse
- Beispiel 2: So erhalten Sie Metadaten von Variablen
- Beispiel 3: So erhalten Sie Metadaten der Methode
- Beispiel 4: So erhalten Sie Metadaten von Konstruktoren
Klasse im Paket java.lang.reflect
Im Folgenden finden Sie eine Liste verschiedener Java-Klassen in java.lang.package, um Reflection- zu implementieren.
- Feld : Diese Klasse wird verwendet, um deklarative Informationen wie Datentyp, Zugriffsmodifikator, Name und Wert einer Variablen zu erfassen.
- Methode : Diese Klasse wird verwendet, um deklarative Informationen wie Zugriffsmodifikator, Rückgabetyp, Name, Parametertyp und Ausnahmetyp einer Methode zu erfassen.
- Konstruktor : Diese Klasse wird verwendet, um deklarative Informationen wie Zugriffsmodifikator, Name und Parametertypen eines Konstruktors zu erfassen.
- Modifikator : Diese Klasse wird verwendet, um Informationen zu einem bestimmten Zugriffsmodifikator zu sammeln.
In java.lang.Class verwendete Methoden
- Public String getName () : Gibt den Namen der Klasse zurück.
- public Class getSuperclass () : Gibt die Superklassenreferenz zurück
- Öffentliche Klasse [] getInterfaces () : Gibt ein Array von Schnittstellen zurück, die von der angegebenen Klasse implementiert wurden
- Öffentlich in getModifiers (): Gibt einen ganzzahligen Wert zurück, der die Modifikatoren der angegebenen Klasse darstellt, die als Parameter an die Methode " public static String toString (int i)" übergeben werden müssen, die den Zugriffsspezifizierer für die angegebene Klasse zurückgibt.
So erhalten Sie vollständige Informationen zu einer Klasse
Um Informationen zu Variablen, Methoden und Konstruktoren einer Klasse zu erhalten, müssen Sie ein Objekt der Klasse erstellen.public class Guru99ClassObjectCreation {public static void main (String[] args) throws ClassNotFoundException {//1 - By using Class.forname() methodClass c1 = Class.forName("Guru99ClassObjectCreation");//2- By using getClass() methodGuru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation();Class c2 = guru99Obj.getClass();//3- By using .classClass c3= Guru99ClassObjectCreation.class;}}
Beispiel 1: So erhalten Sie Metadaten der Klasse
Das folgende Beispiel zeigt, wie Metadaten abgerufen werden, z. B.: Klassenname, Name der Superklasse, implementierte Schnittstellen und Zugriffsmodifikatoren einer Klasse.
Wir erhalten die Metadaten der folgenden Klasse mit dem Namen Guru99Base.class:
import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
- Der Name der Klasse lautet: Guru99Base
- Die Zugriffsmodifikatoren sind: öffentlich und abstrakt
- Es wurden Schnittstellen implementiert: Serializable und Cloneable
- Da keine Klasse explizit erweitert wurde, lautet die Superklasse: java.lang.Object
import java.lang.reflect.Modifier;public class Guru99GetclassMetaData {public static void main (String [] args) throws ClassNotFoundException {// Create Class object for Guru99Base.classClassguru99ClassObj = Guru99Base.class;// Print name of the classsystem.out.println("Name of the class is : " +guru99ClassObj.getName());// Print Super class namesystem.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() methodclass[] guru99InterfaceList = guru99classObj.getInterfaces();// Print the implemented interfaces using foreach loopsystem.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 classint guru99AccessModifier= guru99classObj.getModifiers();// Print the access modifiersSystem.Out.println("Access modifiers of the class are : " +Modifier.tostring(guru99AccessModifier));}}
- Drucken Sie den Namen der Klasse mit der Methode getName
- Drucken Sie den Namen der Superklasse mit der Methode getSuperClass (). GetName ()
- Drucken Sie den Namen der implementierten Schnittstellen
- Drucken Sie die von der Klasse verwendeten Zugriffsmodifikatoren
Beispiel 2: So erhalten Sie Metadaten von Variablen
Die folgenden Beispiele zeigen, wie Metadaten von Variablen abgerufen werden:
Hier erstellen wir eine Klasse namens Guru99VariableMetaData .class mit einigen Variablen:
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";}Schritte zum Abrufen der Metadaten zu den Variablen in der obigen Klasse:
- Erstellen Sie das Klassenobjekt der obigen Klasse, dh Guru99VariableMetaData.class, wie folgt:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Rufen Sie die Metadaten in Form eines Feldarrays mit den folgenden Methoden getFields () oder getDeclaredFields () ab:
Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
Die Methode getFields () gibt Metadaten der öffentlichen Variablen sowohl aus der angegebenen Klasse als auch aus ihrer Superklasse zurück.
Die Methode getDeclaredFields () gibt nur Metadaten aller Variablen der angegebenen Klasse zurück.
- Rufen Sie den Namen der Variablen mit der Methode "public String getName ()" ab.
- Rufen Sie den Datentyp der Variablen mit der Methode "public Class getType ()" ab.
- Ermitteln Sie den Wert der Variablen mit der Methode "public xxx get (Field)".
Hier kann xxx ein Byte oder ein Kurzwert eines beliebigen Werttyps sein, den wir abrufen möchten.
- Rufen Sie die Zugriffsmodifikatoren der Variablen mit den Methoden getModifier () und Modifier.toString (int i) ab.
Hier schreiben wir eine Klasse, um die Metadaten der in der Klasse Guru99VariableMetaData .class vorhandenen Variablen abzurufen:
package guru;import java.lang.reflect.Field;public class Guru99VariableMetaDataTest {public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {// Create Class object for Guru99VariableMetaData.classGuru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();// Get the metadata of all the fields of the class Guru99VariableMetaDataField[] guru99Field1= guru99ClassObjVar.getDeclaredFields();// Print name, datatypes, access modifiers and values of the varibales of the specified classfor(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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Klassenobjekt für Guru99VariableMetaData.class erstellt
- Habe alle Metadaten der Variablen in einem Field-Array erhalten
- Druckte alle Variablennamen in der Klasse Guru99VariableMetaData.class
- Druckte alle Datentypen der Variablen in der Klasse Guru99VariableMetaData.class
- Druckte alle Zugriffsmodifikatoren der Variablen in der Klasse Guru99VariableMetaData.class
- Gedruckte Werte aller Variablen in Druckte alle Datentypen der Variablen in der Klasse Guru99VariableMetaData.class
- Erstellen Sie das Klassenobjekt der obigen Klasse, dh Guru99MethodMetaData.class, wie folgt:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Abrufen von Methodeninformationen in einem Methodenarray mithilfe der Methoden getMethods () und getDeclaredMethods () wie folgt:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
Die Methode getMethods () gibt Metadaten der öffentlichen Methoden sowohl aus der angegebenen Klasse als auch aus ihrer Superklasse zurück.
Die Methode getDeclaredMethods () gibt nur Metadaten aller Methoden der angegebenen Klasse zurück.
- Rufen Sie den Namen der Methode mit der Methode getName () ab .
- Rufen Sie den Rückgabetyp der Methode mit der Methode getReturnType () ab .
- Rufen Sie die Zugriffsmodifikatoren der Methoden mit den Methoden getModifiers () und Modifiers.toString (int i) ab .
- Rufen Sie Methodenparametertypen mit der Methode getParameterTypes () ab , die ein Klassenarray zurückgibt.
- Löst eine ausgelöste Ausnahme mit der Methode getExceptionTypes () aus , die ein Klassenarray zurückgibt.
- Klassenobjekt für Guru99MethodMetaData.class erstellt
- Habe alle Metadaten aller Methoden in einem Methodenarray erhalten
- Druckte alle in der Klasse Guru99MethodMetaData.class vorhandenen Methodennamen
- Gedruckte Rückgabetypen der Methoden in der Klasse Guru99MethodMetaData.class
- Druckte alle Zugriffsmodifikatoren der Methoden in der Klasse Guru99MethodMetaData.class
- Gedruckte Parametertypen der Methoden in Guru99MethodMetaData.class
- Gedruckte Ausnahmen werden von Methoden in Guru99MethodMetaData.class ausgelöst
- Klassenobjekt für Guru99Constructor.class erstellt
- Alle Metadaten aller Konstruktoren in einem Konstruktorarray wurden abgerufen
- Druckte alle Konstruktornamen aus, die in der Klasse Guru99Constructor.class vorhanden sind
- Druckte alle Zugriffsmodifikatoren der Konstruktoren in der Klasse Guru99Constructor.class
- Gedruckte Parametertypen der Konstruktoren in Guru99Constructor.class
- Gedruckte Ausnahmen werden von Konstruktoren in Guru99Constructor.class ausgelöst
- Die Reflexionsprogrammierung in Java hilft beim Abrufen und Ändern von Informationen über Klassen und Klassenmitglieder wie Variablen, Methoden und Konstruktoren.
- Die Reflection-API in Java kann mithilfe von Klassen im Paket java.lang.reflect und Methoden der Klasse java.lang.Class implementiert werden.
- Einige häufig verwendete Methoden der Klasse java.lang.Class sind getName (), getSuperclass (), getInterfaces (), getModifiers () usw.
- Einige häufig verwendete Klassen im Paket java.lang.reflect sind Field, Method, Constructor, Modifier usw.
- Die Reflection-API kann auf private Methoden und Variablen einer Klasse zugreifen, die eine Sicherheitsbedrohung darstellen können.
- Die Reflection-API ist eine leistungsstarke Funktion, die von Java bereitgestellt wird. Sie bringt jedoch einige Gemeinkosten mit sich, z. B. eine geringere Leistung, Sicherheitslücke und Berechtigungsprobleme. Daher sollte die Reflexions-API als letzter Ausweg für die Ausführung einer Operation behandelt werden.
Beispiel 3: So erhalten Sie Metadaten der Methode
Die folgenden Beispiele zeigen, wie Metadaten einer Methode abgerufen werden:
Hier erstellen wir eine Klasse mit dem Namen Guru99MethodMetaData .class mit einigen 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");}}
Schritte zum Abrufen der Metadaten zu den Methoden in der obigen Klasse:
Hier schreiben wir eine Klasse, um die Metadaten der in der Klasse Guru99MethodMetaData.class vorhandenen Methoden abzurufen:
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.classclass 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 namesSystem.out.println("Name of the method : "+method.getName());// Print return type of the methodsSystem.out.println("Return type of the method : "+method.getReturnType());//Get the access modifier list and printint guru99ModifierList = method.getModifiers();System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList));// Get and print parameters of the methodsClass[] 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 methodClass[] 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
Beispiel 4: So erhalten Sie Metadaten von Konstruktoren
Die folgenden Beispiele zeigen, wie Metadaten von Konstruktoren abgerufen werden:
Hier erstellen wir eine Klasse namens Guru99Constructor.class mit verschiedenen Konstruktoren:
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 schreiben wir eine Klasse, um die Metadaten der Konstruktoren abzurufen, die in der Klasse Guru99Constructor.class vorhanden sind:
package guru;import java.lang.reflect.Constructor;public class Guru99ConstructorMetaDataTest {public static void main (String[] args) {// Create Class object for Guru99Constructor.classClass guru99Class=Guru99Constructor.class;// Get all the constructor information in the Constructor arrayConstructor[] guru99ConstructorList = guru99Class.getConstructors();for (Constructor constructor : guru99ConstructorList) {// Print all name of each constructorSystem.out.println("Constrcutor name : "+constructor.getName());//Get and print access modifiers of each constructorint guru99Modifiers= constructor.getModifiers();System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers));// Get and print parameter typesClass[] 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 constructorsClass[] 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("*******************************************");}}}
Zusammenfassung: