Č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;}}
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 {}
- Názov triedy je: Guru99Base
- Jeho modifikátory prístupu sú: verejné a abstraktné
- Má implementované rozhrania: Serializovateľné a Klonovateľné
- Pretože výslovne nerozšíril žiadnu triedu, je to super trieda: 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));}}
- vytlačte názov triedy pomocou metódy getName
- Vytlačte si názov super triedy pomocou metódy getSuperClass (). GetName ()
- Vytlačte si názov implementovaných rozhraní
- 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:
- Vytvorte objekt triedy z vyššie uvedenej triedy, tj. Guru99VariableMetaData.class, ako je uvedené nižšie:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
- 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.
- Získajte názov premenných pomocou metódy "public String getName ()".
- Získajte údajový typ premenných pomocou metódy „public Class getType ()“.
- 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ť.
- 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Bol vytvorený objekt triedy pre Guru99VariableMetaData.class
- Mám všetky metadáta premenných v poli Field
- Vytlačené všetky názvy premenných v triede Guru99VariableMetaData.class
- Vytlačili sa všetky dátové typy premenných v triede Guru99VariableMetaData.class
- Vytlačené všetky modifikátory prístupu premenných v triede Guru99VariableMetaData.class
- Vytlačené hodnoty všetkých premenných v Vytlačené všetky dátové typy premenných v triede Guru99VariableMetaData.class
- Vytvorte objekt triedy z vyššie uvedenej triedy, tj. Guru99MethodMetaData.class, ako je uvedené nižšie:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
- 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.
- Získajte názov metódy pomocou metódy getName () .
- Získajte návratový typ metódy pomocou metódy getReturnType () .
- Získajte modifikátory prístupu metód pomocou metód getModifiers () a Modifiers.toString (int i) .
- Získajte typy parametrov metódy pomocou metódy getParameterTypes (), ktorá vráti pole triedy.
- Získajte vyhodenú výnimku pomocou metódy getExceptionTypes (), ktorá vráti pole triedy.
- Bol vytvorený objekt triedy pre Guru99MethodMetaData.class
- Získal som všetky metaúdaje všetkých metód v poli Method
- Vytlačené všetky názvy metód, ktoré sa nachádzajú v triede Guru99MethodMetaData.class
- Vytlačené návratové typy metód v triede Guru99MethodMetaData.class
- Vytlačili sa všetky modifikátory prístupu metód v triede Guru99MethodMetaData.class
- Vytlačené typy parametrov metód v Guru99MethodMetaData.class
- Vytlačené výnimky vyvolávajú metódy v Guru99MethodMetaData.class
- Bol vytvorený objekt triedy pre Guru99Constructor.class
- Mám všetky metaúdaje všetkých konštruktorov v poli konštruktora
- Vytlačené všetky mená konštruktorov, ktoré sa nachádzajú v triede Guru99Constructor.class
- Vytlačili sa všetky modifikátory prístupu konštruktorov v triede Guru99Constructor.class
- Vytlačené typy parametrov konštruktorov v Guru99Constructor.class
- Vytlačené výnimky vyvolávajú konštruktory v Guru99Constructor.class
- 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.
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:
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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
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("*******************************************");}}}
Zhrnutie: