Výukový program Java Reflection API s príkladom

Obsah:

Anonim

Čo je to Reflexia v Jave?

Java Reflection je proces analýzy a úpravy všetkých schopností triedy za behu programu. Reflection API v Jave sa používa na manipuláciu s triedou a jej členmi, ktoré zahŕňajú polia, metódy, konštruktor atď. Za behu modulu.

Jednou z výhod reflexného API v Jave je, že dokáže manipulovať aj so súkromnými členmi triedy.

Balík java.lang.reflect poskytuje mnoho tried na implementáciu odrazu java.Metódy triedy java.lang.Class sa používajú na zhromaždenie úplných metadát konkrétnej triedy.

V tomto návode sa naučíte

  • Čo je to Reflexia
  • Trieda v balíku java.lang.reflect
  • Metódy použité v java.lang.Class
  • Ako získať úplné informácie o triede
  • Príklad 1: Ako získať metaúdaje triedy
  • Príklad 2: Ako získať metaúdaje premennej
  • Príklad 3: Ako získať metaúdaje metódy
  • Príklad 4: Ako získať metaúdaje konštruktorov

Trieda v balíku java.lang.reflect

Nasleduje zoznam rôznych tried Java v balíku java.lang.package na implementáciu reflexie-

  • Pole : Táto trieda sa používa na zhromažďovanie deklaratívnych informácií, ako sú dátový typ, modifikátor prístupu, názov a hodnota premennej.
  • Metóda : Táto trieda sa používa na zhromažďovanie deklaratívnych informácií, ako sú modifikátor prístupu, návratový typ, názov, typy parametrov a typ výnimky metódy.
  • Konštruktor : Táto trieda sa používa na zhromažďovanie deklaratívnych informácií, ako sú modifikátory prístupu, typy názvov a parametrov konštruktora.
  • Modifikátor : Táto trieda sa používa na zhromažďovanie informácií o konkrétnom modifikátore prístupu.

Metódy použité v java.lang.Class

  • Public String getName () : Vráti názov triedy.
  • public Class getSuperclass () : Vráti odkaz na super triedu
  • Verejná trieda [] getInterfaces () : Vráti pole rozhraní implementovaných zadanou triedou
  • Public in getModifiers (): Vráti celočíselnú hodnotu predstavujúcu modifikátory zadanej triedy, ktorú je potrebné odovzdať ako parameter metóde „ public static String toString (int i)“, ktorá vráti špecifikátor prístupu pre danú triedu.

Ako získať úplné informácie o triede

Ak chcete získať informácie o premenných, metódach a konštruktoroch triedy, musíme vytvoriť objekt triedy.
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;}}
  • Nasledujúci príklad ukazuje rôzne spôsoby, ako vytvoriť objekt triedy "class":
  • Príklad 1: Ako získať metaúdaje triedy

    Nasledujúci príklad ukazuje, ako získať metadáta, ako napríklad: názov triedy, názov super triedy, implementované rozhrania a modifikátory prístupu triedy.

    Získame metadáta pod triedou s názvom Guru99Base.class:

    import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
    1. Názov triedy je: Guru99Base
    2. Jeho modifikátory prístupu sú: verejné a abstraktné
    3. Má implementované rozhrania: Serializovateľné a Klonovateľné
    4. Pretože výslovne nerozšíril žiadnu triedu, je to super trieda: java.lang.Object
    Nižšie uvedená trieda získa meta údaje Guru99Base.class a vytlačí ich:
    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. vytlačte názov triedy pomocou metódy getName
    2. Vytlačte si názov super triedy pomocou metódy getSuperClass (). GetName ()
    3. Vytlačte si názov implementovaných rozhraní
    4. Vytlačte modifikátory prístupu používané triedou

    Príklad 2: Ako získať metaúdaje premennej

    Nasledujúci príklad ukazuje, ako získať metadáta premennej:

    Tu vytvárame triedu s názvom Guru99VariableMetaData .class s niektorými premennými:

    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";}
    Kroky na získanie metadát o premenných vo vyššie uvedenej triede:
    1. Vytvorte objekt triedy z vyššie uvedenej triedy, tj. Guru99VariableMetaData.class, ako je uvedené nižšie:
      Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. Získajte metadáta vo forme poľného poľa pomocou metód getFields () alebo getDeclaredFields (), ako je uvedené nižšie:
      Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

    Metóda getFields () vracia metadáta verejnej premennej zo zadanej triedy aj z jej super triedy.

    Metóda getDeclaredFields () vracia metadáta všetkých premenných iba zo zadanej triedy.

    1. Získajte názov premenných pomocou metódy "public String getName ()".
    2. Získajte údajový typ premenných pomocou metódy „public Class getType ()“.
    3. Získajte hodnotu premennej pomocou metódy "public xxx get (Field)".

      Tu môže byť xxx bajt alebo menšia hodnota ľubovoľného typu hodnoty, ktorú chceme načítať.

    4. Získajte modifikátory prístupu premenných pomocou metód getModifier () a Modifier.toString (int i).

      Tu píšeme triedu, aby sme získali metadáta premenných prítomných v triede 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. Bol vytvorený objekt triedy pre Guru99VariableMetaData.class
      2. Mám všetky metadáta premenných v poli Field
      3. Vytlačené všetky názvy premenných v triede Guru99VariableMetaData.class
      4. Vytlačili sa všetky dátové typy premenných v triede Guru99VariableMetaData.class
      5. Vytlačené všetky modifikátory prístupu premenných v triede Guru99VariableMetaData.class
      6. Vytlačené hodnoty všetkých premenných v Vytlačené všetky dátové typy premenných v triede Guru99VariableMetaData.class

      Príklad 3: Ako získať metaúdaje metódy

      Nasledujúci príklad ukazuje, ako získať metadáta metódy:

      Tu pomocou niektorých metód vytvárame triedu s názvom Guru99MethodMetaData .class

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

      Kroky na získanie metadát o metódach vo vyššie uvedenej triede:

      1. Vytvorte objekt triedy z vyššie uvedenej triedy, tj. Guru99MethodMetaData.class, ako je uvedené nižšie:
        Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
      2. Získajte informácie o metóde v poli Method pomocou metód getMethods () a getDeclaredMethods (), ako je uvedené nižšie:
        Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

        Metóda getMethods () vracia metadáta verejných metód zo zadanej triedy aj z jej super triedy.

        Metóda getDeclaredMethods () vracia metadáta všetkých metód iba zo zadanej triedy.

      3. Získajte názov metódy pomocou metódy getName () .
      4. Získajte návratový typ metódy pomocou metódy getReturnType () .
      5. Získajte modifikátory prístupu metód pomocou metód getModifiers () a Modifiers.toString (int i) .
      6. Získajte typy parametrov metódy pomocou metódy getParameterTypes (), ktorá vráti pole triedy.
      7. Získajte vyhodenú výnimku pomocou metódy getExceptionTypes (), ktorá vráti pole triedy.

      Tu píšeme triedu, aby sme získali metadáta metód prítomných v triede 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. Bol vytvorený objekt triedy pre Guru99MethodMetaData.class
      2. Získal som všetky metaúdaje všetkých metód v poli Method
      3. Vytlačené všetky názvy metód, ktoré sa nachádzajú v triede Guru99MethodMetaData.class
      4. Vytlačené návratové typy metód v triede Guru99MethodMetaData.class
      5. Vytlačili sa všetky modifikátory prístupu metód v triede Guru99MethodMetaData.class
      6. Vytlačené typy parametrov metód v Guru99MethodMetaData.class
      7. Vytlačené výnimky vyvolávajú metódy v Guru99MethodMetaData.class

      Príklad 4: Ako získať metaúdaje konštruktorov

      Nasledujúce príklady ukazujú, ako získať metadáta konštruktorov:

      Tu vytvárame triedu s názvom Guru99Constructor.class s rôznymi konštruktormi:

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

      Tu píšeme triedu, aby sme získali metadáta konštruktorov prítomných v triede 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. Bol vytvorený objekt triedy pre Guru99Constructor.class
      2. Mám všetky metaúdaje všetkých konštruktorov v poli konštruktora
      3. Vytlačené všetky mená konštruktorov, ktoré sa nachádzajú v triede Guru99Constructor.class
      4. Vytlačili sa všetky modifikátory prístupu konštruktorov v triede Guru99Constructor.class
      5. Vytlačené typy parametrov konštruktorov v Guru99Constructor.class
      6. Vytlačené výnimky vyvolávajú konštruktory v Guru99Constructor.class

      Zhrnutie:

      • Reflexné programovanie v jave pomáha pri načítaní a úprave informácií o triedach a členoch triedy, ako sú premenné, metódy, konštruktory.
      • Reflexné API v Jave je možné implementovať pomocou tried v balíku java.lang.reflect a metód triedy java.lang.Class.
      • Niektoré bežne používané metódy triedy java.lang.Class sú getName (), getSuperclass (), getInterfaces (), getModifiers () atď.
      • Niektoré bežne používané triedy v balíku java.lang.reflect sú Field, Method, Constructor, Modifier atď.
      • Reflection API môže pristupovať k súkromným metódam a premenným triedy, ktoré by mohli byť bezpečnostnou hrozbou.
      • Reflection API je výkonná funkcia, ktorú poskytuje Java, ale prichádza s niektorými režijnými nákladmi, ako je pomalší výkon, zraniteľnosť zabezpečenia a problém s povolením. Reflexné API by sa preto malo považovať za poslednú možnosť pri uskutočňovaní operácie.