Tutorial Java Reflection API cu Exemplu

Cuprins:

Anonim

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;}}
  • Următorul exemplu arată diferite moduri de a crea obiectul clasei „clasă”:
  • 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 {}
    1. Numele clasei este: Guru99Base
    2. Modificatorii de acces sunt: ​​public și abstract
    3. A implementat interfețe: Serializabile și Clonabile
    4. Deoarece nu a extins în mod explicit nicio clasă, super clasa este: java.lang.Object
    În clasa de mai jos veți obține meta datele Guru99Base.class și le veți tipări:
    import java.lang.reflect.Modifier;public class Guru99GetclassMetaData {public static void main (String [] args) throws ClassNotFoundException {// Create Class object for Guru99Base.classClass  guru99ClassObj = 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));}} 
    1. tipăriți numele clasei folosind metoda getName
    2. Imprimați numele clasei super folosind metoda getSuperClass (). GetName ()
    3. Imprimați numele interfețelor implementate
    4. 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:
    1. Creați obiectul clasei clasei de mai sus, adică Guru99VariableMetaData.class după cum urmează:
      Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. 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.

    1. Obțineți numele variabilelor folosind metoda „public String getName ()”.
    2. Obțineți tipul de date al variabilelor folosind metoda „public Class getType ()”.
    3. 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.

    4. 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
      1. Obiect de clasă creat pentru Guru99VariableMetaData.class
      2. Am obținut toate metadatele variabilelor dintr-o matrice Field
      3. S-au tipărit toate numele variabilelor din clasa Guru99VariableMetaData.class
      4. S-au tipărit toate tipurile de date ale variabilelor din clasa Guru99VariableMetaData.class
      5. S-au tipărit toți modificatorii de acces ai variabilelor din clasa Guru99VariableMetaData.class
      6. Valori tipărite ale tuturor variabilelor din Tipărite toate tipurile de date ale variabilelor din clasa Guru99VariableMetaData.class

      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:

      1. Creați obiectul clasei clasei de mai sus, adică Guru99MethodMetaData.class după cum urmează:
        Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
      2. 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.

      3. Obțineți numele metodei folosind metoda getName () .
      4. Obțineți tipul de returnare a metodei folosind metoda getReturnType () .
      5. Obțineți modificatori de acces ai metodelor folosind metodele getModifiers () și Modifiers.toString (int i) .
      6. Obțineți tipuri de parametri de metodă utilizând metoda getParameterTypes () care returnează o matrice de clase.
      7. Obțineți excepția aruncată folosind metoda getExceptionTypes () care returnează o matrice de clase.

      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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
      1. Obiect de clasă creat pentru Guru99MethodMetaData.class
      2. Am obținut toate metadatele tuturor metodelor dintr-o matrice de metode
      3. S-au tipărit toate numele metodelor prezente în clasa Guru99MethodMetaData.class
      4. Tipuri returnate tipărite ale metodelor din clasa Guru99MethodMetaData.class
      5. S-au tipărit toți modificatorii de acces ai metodelor din clasa Guru99MethodMetaData.class
      6. Tipuri de parametri tipăriți ai metodelor din Guru99MethodMetaData.class
      7. Excepțiile tipărite sunt aruncate prin metode în Guru99MethodMetaData.class

      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("*******************************************");}}}
      1. Obiect de clasă creat pentru Guru99Constructor.class
      2. Am obținut toate metadatele tuturor constructorilor dintr-o matrice de constructori
      3. S-au tipărit toate numele constructorului prezente în clasa Guru99Constructor.class
      4. S-au tipărit toți modificatorii de acces ai constructorilor din clasa Guru99Constructor.class
      5. Tipuri de parametri tipăriți ai constructorilor din Guru99Constructor.class
      6. Excepțiile tipărite sunt aruncate de constructori în Guru99Constructor.class

      Rezumat:

      • 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.