Što je Reflection u Javi?
Java Reflection je postupak analize i modificiranja svih mogućnosti klase u vrijeme izvođenja. API refleksije u Javi koristi se za manipulaciju razredom i njezinim članovima koji uključuju polja, metode, konstruktor itd. Tijekom izvođenja.
Jedna od prednosti API-ja za razmišljanje u Javi je što može manipulirati i privatnim članovima klase.
Paket java.lang.reflect nudi mnoge klase za implementaciju refleksije java.Metode klase java.lang.Class koriste se za prikupljanje kompletnih metapodataka određene klase.
U ovom vodiču naučit ćete-
- Što je Refleksija
- Predavanje u paketu java.lang.reflect
- Metode korištene u java.lang.Class
- Kako dobiti potpune informacije o predavanju
- Primjer 1: Kako doći do metapodataka klase
- Primjer 2: Kako doći do metapodataka varijable
- Primjer 3: Kako doći do metapodataka metode
- Primjer 4: Kako doći do metapodataka konstruktora
Predavanje u paketu java.lang.reflect
Slijedi popis različitih Java klasa u java.lang.package za implementaciju refleksije-
- Polje : Ova se klasa koristi za prikupljanje deklarativnih podataka poput tipa podataka, modifikatora pristupa, imena i vrijednosti varijable.
- Metoda : Ova se klasa koristi za prikupljanje deklarativnih podataka kao što su modifikator pristupa, vrsta povrata, ime, vrste parametara i vrsta iznimke metode.
- Konstruktor : Ova se klasa koristi za prikupljanje deklarativnih podataka poput modifikatora pristupa, naziva i tipova parametara konstruktora.
- Modifikator : Ova se klasa koristi za prikupljanje podataka o određenom modifikatoru pristupa.
Metode korištene u java.lang.Class
- Javni niz getName () : Vraća naziv klase.
- javna klasa getSuperclass () : Vraća referencu super klase
- Javna klasa [] getInterfaces () : Vraća niz sučelja koja je implementirala navedena klasa
- Javno u getModifiers (): Vraća cijelu vrijednost koja predstavlja modifikatore navedene klase koja treba biti proslijeđena kao parametar u metodu " javnog statičkog niza toString (int i)" koja vraća specifikator pristupa za datu klasu.
Kako dobiti potpune informacije o predavanju
Da bismo dobili informacije o varijablama, metodama i konstruktorima klase, moramo stvoriti objekt klase.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;}}
Primjer 1: Kako doći do metapodataka klase
Sljedeći primjer pokazuje kako doći do metapodataka kao što su: Ime klase, naziv super klase, implementirana sučelja i modifikatori pristupa klase.
Dobit ćemo metapodatke donjeg razreda pod nazivom Guru99Base.class:
import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
- Naziv klase je: Guru99Base
- Modifikatori pristupa su: javni i apstraktni
- Primijenio je sučelja: seribilna i klonirana
- Budući da nije eksplicitno proširio nijednu klasu, super klasa je: 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));}}
- ispisati naziv klase metodom getName
- Ispišite ime super klase pomoću metode getSuperClass (). GetName ()
- Ispišite naziv implementiranih sučelja
- Ispišite modifikatore pristupa koje koristi klasa
Primjer 2: Kako doći do metapodataka varijable
Sljedeći primjeri pokazuju kako doći do metapodataka varijable:
Ovdje stvaramo klasu pod nazivom Guru99VariableMetaData .class s nekim varijablama:
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";}Koraci za dobivanje metapodataka o varijablama u gornjoj klasi:
- Stvorite objekt klase gore navedene klase, tj. Guru99VariableMetaData.class kao dolje:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Nabavite metapodatke u obliku polja s metodama getFields () ili getDeclaredFields () kao što je prikazano u nastavku:
Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
getFields () metoda vraća metapodatke javne varijable iz navedene klase, kao i iz njene super klase.
metoda getDeclaredFields () vraća metapodatke svih varijabli samo iz navedene klase.
- Dohvatite ime varijabli pomoću metode "public String getName ()".
- Nabavite tip podataka varijabli pomoću metode "public Class getType ()".
- Dobijte vrijednost varijable metodom "public xxx get (Field)".
Ovdje xxx može biti bajt ili kratica bilo koje vrste vrijednosti koju želimo dohvatiti.
- Nabavite modifikatore pristupa varijabla pomoću metoda getModifier () i Modifier.toString (int i).
Ovdje pišemo klasu da bismo dobili metapodatke varijabli prisutnih u klasi 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Stvoren objekt klase za Guru99VariableMetaData.class
- Dobili smo sve metapodatke varijabli u polju Field
- Ispisana sva imena varijabli u klasi Guru99VariableMetaData.class
- Ispisane sve vrste podataka varijabli u klasi Guru99VariableMetaData.class
- Ispisani svi modifikatori pristupa varijabli u klasi Guru99VariableMetaData.class
- Ispisane vrijednosti svih varijabli u Ispisane sve vrste podataka varijabli u klasi Guru99VariableMetaData.class
- Stvorite objekt klase gornje klase, tj. Guru99MethodMetaData.class kao dolje:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
- Dohvatite informacije o metodi u polju Method pomoću metoda getMethods () i getDeclaredMethods () kao što je prikazano u nastavku:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
getMethods () metoda vraća metapodatke javnih metoda iz navedene klase, kao i iz njene super klase.
getDeclaredMethods () metoda vraća metapodatke svih metoda samo iz navedene klase.
- Dohvatite ime metode pomoću metode getName () .
- Nabavite vrstu povrata metode pomoću metode getReturnType () .
- Nabavite modifikatore pristupa metodama pomoću metoda getModifiers () i Modifiers.toString (int i) .
- Dobijte vrste parametara metode pomoću metode getParameterTypes () koja vraća niz klasa.
- Dobiti izbačenu iznimku pomoću metode getExceptionTypes () koja vraća niz klasa.
- Stvoren objekt klase za Guru99MethodMetaData.class
- Dobili smo sve metapodatke svih metoda u polju Metoda
- Ispisana su sva imena metoda prisutna u klasi Guru99MethodMetaData.class
- Ispisani povratni tipovi metoda u klasi Guru99MethodMetaData.class
- Ispisani svi modifikatori pristupa metoda u klasi Guru99MethodMetaData.class
- Ispisani tipovi parametara metoda u klasi Guru99MethodMetaData.class
- Ispisane iznimke bacaju metode u klasi Guru99MethodMetaData.class
- Stvoren objekt klase za Guru99Constructor.class
- Dobio sam sve metapodatke svih konstruktora u nizu Konstruktora
- Ispisana sva imena konstruktora prisutna u klasi Guru99Constructor.class
- Ispisani svi modifikatori pristupa konstruktora u klasi Guru99Constructor.class
- Ispisani tipovi parametara konstruktora u Guru99Constructor.class
- Ispisane iznimke bacaju konstruktori u Guru99Constructor.class
- Programiranje refleksije u javi pomaže u pronalaženju i modificiranju podataka o klasama i članovima klasa kao što su varijable, metode, konstruktori.
- API refleksije u Javi može se implementirati pomoću klasa u paketu java.lang.reflect i metoda klase java.lang.Class.
- Neke najčešće korištene metode klase java.lang.Class su getName (), getSuperclass (), getInterfaces (), getModifiers () itd.
- Neke najčešće korištene klase u paketu java.lang.reflect su Field, Method, Constructor, Modifier itd.
- Reflection API može pristupiti privatnim metodama i varijablama klase koje mogu predstavljati sigurnosnu prijetnju.
- Reflection API je moćna sposobnost koju nudi Java, ali dolazi s nekim općim troškovima kao što su sporije performanse, sigurnosna ranjivost i izdanje dozvola. Stoga bi se API refleksije trebao tretirati kao posljednje sredstvo za izvođenje operacije.
Primjer 3: Kako doći do metapodataka metode
Sljedeći primjeri pokazuju kako doći do metapodataka metode:
Ovdje stvaramo klasu pod nazivom Guru99MethodMetaData .class s nekim metodama
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");}}
Koraci za dobivanje metapodataka o metodama u gornjoj klasi:
Ovdje pišemo klasu kako bismo dobili metapodatke metoda prisutnih u klasi 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
Primjer 4: Kako doći do metapodataka konstruktora
Sljedeći primjeri pokazuju kako doći do metapodataka konstruktora:
Ovdje stvaramo klasu pod nazivom Guru99Constructor.class s različitim konstruktorima:
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{ }}
Ovdje pišemo klasu kako bismo dobili metapodatke konstruktora prisutnih u klasi 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("*******************************************");}}}
Sažetak: