Kaj je Reflection v Javi?
Java Reflection je postopek analize in spreminjanja vseh zmožnosti razreda med izvajanjem. Reflection API v Javi se uporablja za manipulacijo razreda in njegovih članov, ki vključujejo polja, metode, konstruktor itd. Med izvajanjem.
Ena od prednosti API-ja za razmislek v Javi je, da lahko manipulira tudi z zasebnimi člani razreda.
Paket java.lang.reflect ponuja številne razrede za izvajanje odseva java.Metode razreda java.lang.Class se uporabljajo za zbiranje celotnih metapodatkov določenega razreda.
V tej vadnici boste izvedeli-
- Kaj je Odsev
- Predavanje v paketu java.lang.reflect
- Metode, uporabljene v java.lang.Class
- Kako pridobiti popolne informacije o predavanju
- Primer 1: Kako dobiti metapodatke razreda
- Primer 2: Kako dobiti metapodatke spremenljivke
- Primer 3: Kako dobiti metapodatke metode
- Primer 4: Kako dobiti metapodatke konstruktorjev
Predavanje v paketu java.lang.reflect
Sledi seznam različnih razredov Java v java.lang.package za izvajanje refleksije-
- Polje : Ta razred se uporablja za zbiranje deklarativnih informacij, kot so tip podatkov, modifikator dostopa, ime in vrednost spremenljivke.
- Metoda : Ta razred se uporablja za zbiranje deklarativnih informacij, kot so modifikator dostopa, vrsta vrnitve, ime, vrste parametrov in vrsta izjeme metode.
- Konstruktor : Ta razred se uporablja za zbiranje deklarativnih informacij, kot so modifikator dostopa, imena in tipi parametrov konstruktorja.
- Modifikator : Ta razred se uporablja za zbiranje informacij o določenem modifikatorju dostopa.
Metode, uporabljene v java.lang.Class
- Javni niz getName () : Vrne ime razreda.
- public Class getSuperclass () : Vrne referenco super razreda
- Javni razred [] getInterfaces () : Vrne vrsto vmesnikov, ki jih izvaja navedeni razred
- Javno v getModifiers (): Vrne celoštevilčno vrednost, ki predstavlja modifikatorje določenega razreda, ki ga je treba poslati kot parameter metodi " public static String toString (int i)", ki vrne specifikator dostopa za dani razred.
Kako pridobiti popolne informacije o predavanju
Če želite dobiti informacije o spremenljivkah, metodah in konstruktorjih razreda, moramo ustvariti predmet razreda.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;}}
Primer 1: Kako dobiti metapodatke razreda
Naslednji primer prikazuje, kako dobiti metapodatke, kot so: Ime razreda, ime super razreda, implementirani vmesniki in modifikatorji dostopa razreda.
Dobili bomo metapodatke spodnjega razreda z imenom Guru99Base.class:
import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
- Ime predavanja je: Guru99Base
- Modifikatorji dostopa so: javni in abstraktni
- Vdelal je vmesnike: serializiran in klonljiv
- Ker nobenega razreda ni eksplicitno razširil, je super razred: 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));}}
- natisnite ime razreda z uporabo metode getName
- Natisnite ime super razreda z uporabo metode getSuperClass (). GetName ()
- Natisnite ime implementiranih vmesnikov
- Natisnite modifikatorje dostopa, ki jih uporablja razred
Primer 2: Kako dobiti metapodatke spremenljivke
Naslednji primeri kažejo, kako pridobiti metapodatke spremenljivke:
Tu ustvarjamo razred z imenom Guru99VariableMetaData .class z nekaj spremenljivkami:
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";}Koraki za pridobivanje metapodatkov o spremenljivkah v zgornjem razredu:
- Ustvarite objekt razreda zgornjega razreda, tj. Guru99VariableMetaData.class, kot spodaj:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Pridobite metapodatke v obliki polja z uporabo metod getFields () ali getDeclaredFields () , kot je prikazano spodaj:
Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
metoda getFields () vrne metapodatke javne spremenljivke iz navedenega razreda in iz njegovega super razreda.
metoda getDeclaredFields () vrne metapodatke vseh spremenljivk samo iz določenega razreda.
- Pridobite ime spremenljivk z uporabo metode "public String getName ()".
- Pridobite podatkovni tip spremenljivk z metodo "public Class getType ()".
- Pridobite vrednost spremenljivke z metodo "public xxx get (Field)".
Tu je lahko xxx bajt ali kratica katere koli vrste vrednosti, ki jo želimo pridobiti.
- Pridobite modifikatorje dostopa do spremenljivk z metodama getModifier () in Modifier.toString (int i).
Tu pišemo razred, da dobimo metapodatke spremenljivk, ki so prisotne v razredu 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Ustvaril objekt razreda za Guru99VariableMetaData.class
- Imam vse metapodatke o spremenljivkah v polju Field
- Natisnjena vsa imena spremenljivk v razredu Guru99VariableMetaData.class
- Natisnjene vse vrste podatkov spremenljivk v razredu Guru99VariableMetaData.class
- Natisnili vse modifikatorje dostopa do spremenljivk v razredu Guru99VariableMetaData.class
- Natisnjene vrednosti vseh spremenljivk v Natisnjene vse vrste podatkov spremenljivk v razredu Guru99VariableMetaData.class
- Ustvarite objekt razreda zgornjega razreda, tj. Guru99MethodMetaData.class, kot spodaj:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Pridobite informacije o metodi v matriki metode z uporabo metod getMethods () in getDeclaredMethods (), kot je prikazano spodaj:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
metoda getMethods () vrne metapodatke javnih metod iz navedenega razreda in iz njegovega super razreda.
metoda getDeclaredMethods () vrne metapodatke vseh metod samo iz določenega razreda.
- Pridobite ime metode z uporabo metode getName () .
- Vrnite vrsto metode z metodo getReturnType () .
- Pridobite modifikatorje dostopa do metod z uporabo metod getModifiers () in Modifiers.toString (int i) .
- Pridobite vrste parametrov metode z uporabo metode getParameterTypes (), ki vrne matriko razreda.
- Pridobite vrženo izjemo z uporabo metode getExceptionTypes (), ki vrne matriko razreda.
- Ustvaril objekt razreda za Guru99MethodMetaData.class
- Imam vse metapodatke vseh metod v matriki Method
- Natisnjena vsa imena metod, prisotna v razredu Guru99MethodMetaData.class
- Natisnjeni vrnjeni tipi metod v razredu Guru99MethodMetaData.class
- Natisnjeni vsi modifikatorji dostopa do metod v razredu Guru99MethodMetaData.class
- Natisnjeni tipi parametrov metod v razredu Guru99MethodMetaData.class
- Natisnjene izjeme vržejo metode v razredu Guru99MethodMetaData.class
- Ustvaril objekt razreda za Guru99Constructor.class
- Imam vse metapodatke vseh konstruktorjev v matriki Constructor
- Natisnjena vsa imena konstruktorja, prisotna v razredu Guru99Constructor.class
- Natisnili vse modifikatorje dostopa konstruktorjev v razredu Guru99Constructor.class
- Natisnjeni tipi parametrov konstruktorjev v Guru99Constructor.class
- Natisnjene izjeme vržejo konstruktorji v Guru99Constructor.class
- Programiranje refleksije v javi pomaga pri pridobivanju in spreminjanju informacij o razredih in članih razredov, kot so spremenljivke, metode, konstruktorji.
- Reflection API v Javi lahko izvedemo z uporabo razredov v paketu java.lang.reflect in metod razreda java.lang.Class.
- Nekatere pogosto uporabljene metode razreda java.lang.Class so getName (), getSuperclass (), getInterfaces (), getModifiers () itd.
- Nekateri najpogosteje uporabljeni razredi v paketu java.lang.reflect so Field, Method, Constructor, Modifier itd.
- Reflection API lahko dostopa do zasebnih metod in spremenljivk razreda, ki bi lahko predstavljale varnostno grožnjo.
- Reflection API je zmogljiva zmogljivost, ki jo nudi Java, vendar ima nekaj splošnih stroškov, kot so počasnejše delovanje, varnostna ranljivost in težava z dovoljenji. Zato je treba API refleksije obravnavati kot skrajno sredstvo za izvedbo operacije.
Primer 3: Kako dobiti metapodatke metode
Naslednji primeri kažejo, kako pridobiti metapodatke metode:
Tu ustvarjamo razred z imenom Guru99MethodMetaData .class z nekaterimi metodami
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");}}
Koraki za pridobivanje metapodatkov o metodah v zgornjem razredu:
Tu pišemo razred, da dobimo metapodatke metod, prisotnih v razredu 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
Primer 4: Kako dobiti metapodatke konstruktorjev
Naslednji primeri kažejo, kako pridobiti metapodatke konstruktorjev:
Tu ustvarjamo razred z imenom Guru99Constructor.class z različnimi konstruktorji:
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 pišemo razred, da dobimo metapodatke konstruktorjev, prisotnih v razredu 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("*******************************************");}}}
Povzetek: