Java Tutorial Reflection API cu exemplu
โก Rezumat inteligent
Java API-ul Reflection analizeazฤ ศi modificฤ capabilitฤศile unei clase รฎn timpul execuศiei, inclusiv cรขmpurile, metodele ศi constructorii acesteia. Aceastฤ resursฤ explicฤ pachetul java.lang.reflect, metodele cheie ale java.lang.Class ศi patru exemple care citesc metadatele unei clase, variabile, metode ศi constructori.

รn ce este Reflecศia Java?
Java Reflecศia este procesul de analizฤ ศi modificare a tuturor capabilitฤศilor unei clase รฎn timpul execuศiei. API-ul Reflection din Java este utilizat pentru a manipula o clasฤ ศi membrii acesteia, care includ cรขmpuri, metode, constructori etc., รฎn timpul execuศiei.
Un avantaj al API-ului Reflection รฎn Java este cฤ poate manipula ศi membrii privaศi ai clasei.
Pachetul java.lang.reflect oferฤ numeroase clase pentru implementarea reflecศiei. Metodele clasei java.lang.Class sunt utilizate pentru a colecta metadatele complete ale unei anumite clase.
Clasฤ รฎn pachetul java.lang.reflect
รn continuare este o listฤ de diverse Java clase รฎn pachetul java.lang.reflect pentru a implementa reflecศia:
- Camp: Aceastฤ clasฤ este utilizatฤ pentru a colecta informaศii declarative, cum ar fi tipul de date, modificatorul de acces, numele ศi valoarea unei variabile.
- Metodฤ: Aceastฤ clasฤ este utilizatฤ pentru a colecta informaศii declarative, cum ar fi modificatorul de acces, tipul de returnare, numele, tipurile de parametri ศi tipul de excepศie al unei metode.
- Constructor: Aceastฤ clasฤ este utilizatฤ pentru a colecta informaศii declarative, cum ar fi modificatorul de acces, numele ศi tipurile de parametri ai unui constructor.
- Modificator: Aceastฤ clasฤ este utilizatฤ pentru a aduna informaศii despre un anumit modificator de acces.
Metode utilizate รฎn java.lang.Class
- public String getName(): Returneazฤ numele clasei.
- Clasa publicฤ getSuperclass(): Returneazฤ referinศa superclasei.
- Clasa publicฤ[] getInterfaces(): Returneazฤ o matrice de interfeศe implementate de clasa specificatฤ.
- public int getModificatori(): Returneazฤ o valoare รฎntreagฤ reprezentรขnd modificatorii clasei specificate, care trebuie transmisฤ ca parametru metodei โpublic static String toString(int i)โ ce returneazฤ specificatorul de acces pentru clasa datฤ.
Cum sฤ obศineศi informaศii complete despre o clasฤ
Pentru a obศine informaศii despre variabile, metode ศi constructori ai unei clase, trebuie sฤ creฤm un obiect al clasei. Urmฤtorul exemplu prezintฤ diferite modalitฤศi de a crea un obiect al clasei โ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; } }
Exemplul 1: Cum se obศin metadatele clasei
Urmฤtorul exemplu aratฤ cum se obศin metadate precum numele clasei, numele superclasei, interfeศele implementate ศi modificatorii de acces ai unei clase.
Vom obศine metadatele clasei de mai jos numite Guru99Base.class:
import java.io.Serializable; public abstract class Guru99Base implements Serializable, Cloneable { }
- Numele clasei este: Guru99 de bazฤ
- Modificatorii sฤi de acces sunt: โโpublic ศi abstract
- Are interfeศe implementate: Serializabil ศi Clonabil
- รntrucรขt nu a extins explicit nicio clasฤ, superclasa sa este: java.lang.Object
Clasa de mai jos va primi metadatele Guru99Base.class ศi afiศeazฤ-l:
import java.lang.reflect.Modifier; public class Guru99GetclassMetaData { public static void main(String[] args) throws ClassNotFoundException { // Create Class object for Guru99Base.class Class<Guru99Base> 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 using getInterfaces() method Class[] guru99InterfaceList = guru99ClassObj.getInterfaces(); // Print the implemented interfaces using a for-each loop System.out.print("Implemented interfaces are : "); for (Class guru99class1 : guru99InterfaceList) { System.out.print(guru99class1.getName() + " "); } System.out.println(); // Get access modifiers using getModifiers() and Modifier.toString() int guru99AccessModifier = guru99ClassObj.getModifiers(); System.out.println("Access modifiers of the class are : " + Modifier.toString(guru99AccessModifier)); } }
- Afiศeazฤ numele clasei folosind metoda getName().
- Afiศeazฤ numele superclasei folosind metoda getSuperclass().getName().
- Afiศaศi numele interfeศelor implementate.
- Afiศeazฤ modificatorii de acces utilizaศi de clasฤ.
Exemplul 2: Cum se obศin metadatele unei variabile
Urmฤtorul exemplu aratฤ cum se obศin metadatele unei variabile.
Aici, creฤm o clasฤ numitฤ Guru99VariableMetaData.class cu cรขteva variabile:
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"; }
Paศi pentru a obศine metadatele despre variabilele din clasa de mai sus:
- Creaศi obiectul de clasฤ al clasei de mai sus, adicฤ, Guru99VariableMetaData.class, dupฤ cum urmeazฤ:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Obศineศi metadatele sub forma unei matrice de cรขmpuri folosind getFields() or getDeclaredFields() metode dupฤ cum urmeazฤ:
Field[] guru99Field1 = guru99ClassObjVar.getFields(); Field[] guru99Field2 = guru99ClassObjVar.getDeclaredFields();
getFields() Metoda returneazฤ metadatele variabilelor publice din clasa specificatฤ, precum ศi din superclasa sa.
getDeclaredFields() Metoda returneazฤ metadatele tuturor variabilelor doar din clasa specificatฤ.
- Obศineศi numele variabilelor folosind metoda โpublic String getName()โ.
- Obศineศi tipul de date al variabilelor folosind metoda โpublic Class getType()โ.
- Obศineศi valoarea variabilei folosind metoda โpublic xxx get(Field)โ. Aici, xxx poate fi un octet, un short sau orice tip de valoare pe care dorim sฤ o obศinem.
- Obศineศi modificatorii de acces ai variabilelor folosind metodele getModifiers() ศi Modifier.toString(int i).
Aici, scriem o clasฤ pentru a obศine metadatele variabilelor prezente รฎn clasฤ. Guru99VariableMetaData.class:
package guru; import java.lang.reflect.Field; import java.lang.reflect.Modifier; 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 Field[] guru99Field1 = guru99ClassObjVar.getDeclaredFields(); // Print name, data types, access modifiers and values of the variables for (Field field : guru99Field1) { System.out.println("Variable name : " + field.getName()); System.out.println("Datatype of the variable : " + field.getType()); int guru99AccessModifiers = field.getModifiers(); System.out.println("Access Modifiers of the variable : " + Modifier.toString(guru99AccessModifiers)); System.out.println("Value of the variable : " + field.get(guru99ClassVar)); System.out.println(); } } }
- A fost creat un obiect de clasฤ pentru Guru99VariableMetaData.class.
- Am obศinut toate metadatele variabilelor dintr-un array de cรขmpuri.
- A afiศat toate numele variabilelor din clasฤ Guru99VariableMetaData.class.
- A afiศat toate tipurile de date ale variabilelor din clasฤ.
- A afiศat toศi modificatorii de acces ai variabilelor din clasฤ.
- A afiศat valorile tuturor variabilelor din clasฤ.
Exemplul 3: Cum se obศin metadatele metodei
Urmฤtorul exemplu aratฤ cum se obศin metadatele unei metode.
Aici, creฤm o clasฤ numitฤ Guru99MethodMetaData.class cu cรขteva 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 Reflection 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"); } }
Paศi pentru obศinerea metadatelor despre metodele din clasa de mai sus:
- Creaศi obiectul de clasฤ al clasei de mai sus, adicฤ, Guru99MethodMetaData.class, dupฤ cum urmeazฤ:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
- Obศineศi informaศii despre metode dintr-un array Method folosind metodele getMethods() ศi getDeclaredMethods() dupฤ cum urmeazฤ:
Method[] guru99Method1 = guru99ClassObjVar.getMethods(); Method[] guru99Method2 = guru99ClassObjVar.getDeclaredMethods();
getMethods() Metoda returneazฤ metadatele metodelor publice din clasa specificatฤ, precum ศi din superclasa sa. getDeclaredMethods() Metoda returneazฤ metadatele tuturor metodelor doar din clasa specificatฤ.
- Obศineศi numele metodei folosind getName () metodฤ.
- Obศineศi tipul de retur al metodei folosind getReturnType() metodฤ.
- Obศineศi modificatori de acces ai metodelor care utilizeazฤ getModifiers() ศi Modificator.toString(int i) metode.
- Obศineศi tipuri de parametri de metodฤ folosind getParameterTypes() metodฤ, care returneazฤ un array de clase.
- Obศine excepศii generate folosind getExceptionTypes() metodฤ, care returneazฤ un array de clase.
Aici, scriem o clasฤ pentru a obศine metadatele metodelor prezente รฎn clasฤ. 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 Guru99MethodMetaData.class Class guru99ClassObj = Guru99MethodMetaData.class; // Get the metadata of all the methods using getDeclaredMethods() Method[] guru99Methods = guru99ClassObj.getDeclaredMethods(); for (Method method : guru99Methods) { System.out.println("Name of the method : " + method.getName()); System.out.println("Return type of the method : " + method.getReturnType()); int guru99ModifierList = method.getModifiers(); System.out.println("Method access modifiers : " + Modifier.toString(guru99ModifierList)); Class[] guru99ParamList = method.getParameterTypes(); System.out.print("Method parameter types : "); for (Class class1 : guru99ParamList) { System.out.print(class1.getName() + " "); } System.out.println(); Class[] guru99ExceptionList = method.getExceptionTypes(); System.out.print("Exception thrown by method : "); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() + " "); } System.out.println(); } } }
- A fost creat un obiect de clasฤ pentru Guru99MethodMetaData.class.
- Am obศinut toate metadatele tuturor metodelor dintr-o matrice de metode.
- Afiศeazฤ toate numele metodelor prezente รฎn clasฤ.
- A afiศat tipurile de returnare ale metodelor din clasฤ.
- A afiศat toศi modificatorii de acces ai metodelor din clasฤ.
- A afiศat tipurile de parametri ai metodelor.
- A afiศat excepศiile generate de metode.
Exemplul 4: Cum se obศin metadatele constructorilor
Urmฤtorul exemplu aratฤ cum se obศin metadatele constructorilor.
Aici, creฤm o clasฤ numitฤ Guru99Constructor.class cu constructori diferiศi:
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 { } }
Aici, scriem o clasฤ pentru a obศine metadatele constructorilor prezenศi รฎn clasฤ. Guru99Constructor.class:
package guru; import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; 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) { System.out.println("Constructor name : " + constructor.getName()); int guru99Modifiers = constructor.getModifiers(); System.out.println("Constructor modifier : " + Modifier.toString(guru99Modifiers)); Class[] guru99ParamList = constructor.getParameterTypes(); System.out.print("Constructor parameter types : "); for (Class class1 : guru99ParamList) { System.out.print(class1.getName() + " "); } System.out.println(); Class[] guru99ExceptionList = constructor.getExceptionTypes(); System.out.print("Exception thrown by constructors : "); for (Class class1 : guru99ExceptionList) { System.out.print(class1.getName() + " "); } System.out.println(); } } }
- A fost creat un obiect de clasฤ pentru Guru99Constructor.class.
- Am obศinut toate metadatele tuturor constructorilor dintr-un array Constructor.
- A afiศat toate numele constructorilor prezenศi รฎn clasฤ.
- A afiศat toศi modificatorii de acces ai constructorilor din clasฤ.
- A afiศat tipurile de parametri ai constructorilor.
- A afiศat excepศiile generate de constructori.
















