Ce este Reflection în Java?
Java Reflection este procesul de analiză și modificare a tuturor capacităților unei clase în timpul rulării. Reflection API în Java este folosit pentru a manipula clasa și membrii săi care includ câmpuri, metode, constructor etc. în timpul rulării.
Un avantaj al API-ului de reflecție în Java este că poate manipula și membrii privați ai clasei.
Pachetul java.lang.reflect oferă multe clase pentru a implementa reflexia java. Metodele clasei java.lang.Class sunt utilizate pentru a aduna metadatele complete ale unei anumite clase.
În acest tutorial, veți învăța-
- Ce este Reflecția
- Clasa în pachetul java.lang.reflect
- Metode utilizate în java.lang.Class
- Cum să obțineți informații complete despre o clasă
- Exemplul 1: Cum se obțin metadatele clasei
- Exemplul 2: Cum se obțin metadatele variabilei
- Exemplul 3: Cum se obțin metadatele metodei
- Exemplul 4: Cum se obțin metadatele constructorilor
Clasa în pachetul java.lang.reflect
Urmează o listă a diferitelor clase Java din java.lang.package pentru a implementa reflecția-
- Câmp : 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 aduna 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
- Șir public getName () : returnează numele clasei.
- public Class getSuperclass () : Returnează referința super clasei
- Public Class [] getInterfaces () : Returnează o serie de interfețe implementate de clasa specificată
- Public în getModifiers (): Returnează o valoare întreagă reprezentând modificatorii clasei specificate care trebuie transmisă ca parametru la metoda „ public static String toString (int i)” care 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.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;}}
Exemplul 1: Cum se obțin metadatele clasei
Următorul exemplu arată cum să obțineți metadate, cum ar fi: numele clasei, numele super clasei, interfețele implementate și modificatorii de acces ai unei clase.
Vom obține metadatele din clasa de mai jos numită Guru99Base.class:
import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
- Numele clasei este: Guru99Base
- Modificatorii de acces sunt: public și abstract
- A implementat interfețe: Serializabile și Clonabile
- Deoarece nu a extins în mod explicit nicio clasă, super clasa este: 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));}}
- tipăriți numele clasei folosind metoda getName
- Imprimați numele clasei super folosind metoda getSuperClass (). GetName ()
- Imprimați numele interfețelor implementate
- Imprimați modificatorii de acces utilizați de clasă
Exemplul 2: Cum se obțin metadatele variabilei
Următoarele exemple arată cum se obțin metadatele variabilei:
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 clasei clasei de mai sus, adică Guru99VariableMetaData.class după cum urmează:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Obțineți metadatele sub formă de matrice de câmp folosind metodele getFields () sau getDeclaredFields () după cum urmează:
Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
Metoda getFields () returnează metadatele variabilei publice din clasa specificată, precum și din superclasa sa.
Metoda getDeclaredFields () returnează metadatele tuturor variabilelor din clasa specificată numai.
- 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 ar putea fi un octet sau scurt de orice tip de valoare pe care dorim să o preluăm.
- Obțineți modificatorii de acces ai variabilelor folosind metodele getModifier () și Modifier.toString (int i).
Aici, scriem o clasă pentru a obține metadatele variabilelor prezente în clasa 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.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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Obiect de clasă creat pentru Guru99VariableMetaData.class
- Am obținut toate metadatele variabilelor dintr-o matrice Field
- S-au tipărit toate numele variabilelor din clasa Guru99VariableMetaData.class
- S-au tipărit toate tipurile de date ale variabilelor din clasa Guru99VariableMetaData.class
- S-au tipărit toți modificatorii de acces ai variabilelor din clasa Guru99VariableMetaData.class
- Valori tipărite ale tuturor variabilelor din Tipărite toate tipurile de date ale variabilelor din clasa Guru99VariableMetaData.class
- Creați obiectul clasei clasei de mai sus, adică Guru99MethodMetaData.class după cum urmează:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Obțineți informații despre metodă într-o matrice de metode utilizând metoda getMethods () și getDeclaredMethods () după cum urmează:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
Metoda getMethods () returnează metadatele metodelor publice din clasa specificată, precum și din superclasa sa.
Metoda getDeclaredMethods () returnează metadatele tuturor metodelor din clasa specificată numai.
- Obțineți numele metodei folosind metoda getName () .
- Obțineți tipul de returnare a metodei folosind metoda getReturnType () .
- Obțineți modificatori de acces ai metodelor folosind metodele getModifiers () și Modifiers.toString (int i) .
- Obțineți tipuri de parametri de metodă utilizând metoda getParameterTypes () care returnează o matrice de clase.
- Obțineți excepția aruncată folosind metoda getExceptionTypes () care returnează o matrice de clase.
- Obiect de clasă creat pentru Guru99MethodMetaData.class
- Am obținut toate metadatele tuturor metodelor dintr-o matrice de metode
- S-au tipărit toate numele metodelor prezente în clasa Guru99MethodMetaData.class
- Tipuri returnate tipărite ale metodelor din clasa Guru99MethodMetaData.class
- S-au tipărit toți modificatorii de acces ai metodelor din clasa Guru99MethodMetaData.class
- Tipuri de parametri tipăriți ai metodelor din Guru99MethodMetaData.class
- Excepțiile tipărite sunt aruncate prin metode în Guru99MethodMetaData.class
- Obiect de clasă creat pentru Guru99Constructor.class
- Am obținut toate metadatele tuturor constructorilor dintr-o matrice de constructori
- S-au tipărit toate numele constructorului prezente în clasa Guru99Constructor.class
- S-au tipărit toți modificatorii de acces ai constructorilor din clasa Guru99Constructor.class
- Tipuri de parametri tipăriți ai constructorilor din Guru99Constructor.class
- Excepțiile tipărite sunt aruncate de constructori în Guru99Constructor.class
- Programarea reflecției în Java ajută la recuperarea și modificarea informațiilor despre clase și membrii clasei, cum ar fi variabile, metode, constructori.
- Reflection API în Java poate fi implementat folosind clase din pachetul java.lang.reflect și metode ale clasei java.lang.Class.
- Unele metode frecvent utilizate de clasa java.lang.Class sunt getName (), getSuperclass (), getInterfaces (), getModifiers () etc.
- Unele clase utilizate în mod obișnuit în pachetul java.lang.reflect sunt Field, Method, Constructor, Modifier etc.
- Reflection API poate accesa metode și variabile private ale unei clase care ar putea reprezenta o amenințare la adresa securității.
- API-ul Reflection este o funcționalitate puternică oferită de Java, dar vine cu unele cheltuieli generale, cum ar fi performanțe mai lente, vulnerabilitate de securitate și problema permisiunii. Prin urmare, API-ul de reflecție ar trebui tratat ca ultima soluție la efectuarea unei operații.
Exemplul 3: Cum se obțin metadatele metodei
Următoarele exemple arată cum să obțineți 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 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");}}
Pași pentru a obține metadatele despre metodele din clasa de mai sus:
Aici, scriem o clasă pentru a obține metadatele metodelor prezente în clasa 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.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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
Exemplul 4: Cum se obțin metadatele constructorilor
Următoarele exemple arată cum se obțin metadatele constructorilor:
Aici, creăm o clasă numită Guru99Constructor.class cu diferiți constructori:
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 clasa Guru99Constructor.class:
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("*******************************************");}}}
Rezumat: