Java Vodič za Reflection API s primjerom
U čemu je Reflection Java?
Java Refleksija je proces analiziranja i modificiranja svih mogućnosti klase tijekom izvođenja. Reflection API u Java koristi se za manipuliranje klasom i njezinim članovima koji uključuju polja, metode, konstruktor itd. tijekom izvođenja.
Jedna prednost API-ja refleksije u Java jest, može manipulirati i privatnim članovima klase.
Paket java.lang.reflect pruža mnoge klase za implementaciju refleksije java. Metode klase java.lang.Class koriste se za prikupljanje kompletnih metapodataka određene klase.
Klasa u paketu java.lang.reflect
Slijedi popis razne Java Nastava u java.lang.package za implementaciju refleksije-
- Polje: Ova se klasa koristi za prikupljanje deklarativnih informacija kao što su tip podataka, modifikator pristupa, naziv i vrijednost varijable.
- način: Ova se klasa koristi za prikupljanje deklarativnih informacija kao što su modifikator pristupa, tip povrata, naziv, tipovi parametara i tip iznimke metode.
- Konstruktor: Ova se klasa koristi za prikupljanje deklarativnih informacija kao što su modifikator pristupa, naziv i tipovi parametara konstruktora.
- Promijeniti: Ova se klasa koristi za prikupljanje informacija 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 implementiranih od strane navedene klase
-
Javno u getModifiers (): Vraća cjelobrojnu vrijednost koja predstavlja modifikatore navedene klase koju je potrebno proslijediti kao parametar u "javni statički niz u niz (int i )” metoda koja vraća specifikator pristupa za danu klasu.
Kako dobiti potpunu informaciju o razredu
public class Guru99ClassObjectCreation { public static void main (String[] args) throws ClassNotFoundException { //1 - By using Class.forname() method Class c1 = Class.forName("Guru99ClassObjectCreation"); //2- By using getClass() method Guru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation(); Class c2 = guru99Obj.getClass(); //3- By using .class Class c3= Guru99ClassObjectCreation.class; } }
Primjer 1: Kako dobiti metapodatke klase
Sljedeći primjer pokazuje kako dobiti metapodatke kao što su: naziv klase, naziv super klase, implementirana sučelja i modifikatori pristupa klasi.
Dobit ćemo metapodatke donje klase pod nazivom Guru99Base.class:
import java.io.Serializable; public abstract class Guru99Base implements Serializable,Cloneable { }
- Naziv klase je: Guru99Base
- Njegovi modifikatori pristupa su: javni i apstraktni
- Ima implementirana sučelja: Serializable i Cloneable
- Budući da nije eksplicitno proširio niti jednu klasu, njegova super klasa je: java.lang.Object
Donja klasa će dobiti meta podatke Guru99Base.class i ispisati ih:
import java.lang.reflect.Modifier; public class Guru99GetclassMetaData { public static void main (String [] args) throws ClassNotFoundException { // Create Class object for Guru99Base.class Classguru99ClassObj = Guru99Base.class; // Print name of the class system.out.println("Name of the class is : " +guru99ClassObj.getName()); // Print Super class name system.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() method class[] guru99InterfaceList = guru99classObj.getInterfaces(); // Print the implemented interfaces using foreach loop system.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 class int guru99AccessModifier= guru99classObj.getModifiers(); // Print the access modifiers System.Out.println("Access modifiers of the class are : " +Modifier.tostring(guru99AccessModifier)); } }
- ispišite naziv klase koristeći getName metodu
- Ispišite naziv super klase pomoću metode getSuperClass().getName().
- Ispiši naziv implementiranih sučelja
- Ispišite modifikatore pristupa koje koristi klasa
Primjer 2: Kako dobiti metapodatke varijable
Sljedeći primjeri pokazuju kako dobiti metapodatke 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"; }
-
Stvorite objekt klase gornje klase, tj. Guru99VariableMetaData.class kao ispod:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
Dobijte metapodatke u obliku niza polja pomoću getFields() or getDeclaredFields() metode kao 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.
getDeclaredFields() metoda vraća metapodatke svih varijabli samo iz navedene klase.
- Dohvatite nazive varijabli koristeći metodu “javni String getName()”.
- Dohvatite vrstu podataka varijabli pomoću metode "javne klase getType()".
-
Dohvatite vrijednost varijable pomoću metode "javno xxx get (polje)".
Ovdje xxx može biti bajt ili skraćenica od bilo koje vrste vrijednosti koju želimo dohvatiti.
-
Dohvatite modifikatore pristupa varijabli pomoću metoda getModifier() i Modifier.toString(int i).
Ovdje pišemo klasu za dobivanje metapodataka 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.class Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass(); // Get the metadata of all the fields of the class Guru99VariableMetaData Field[] guru99Field1= guru99ClassObjVar.getDeclaredFields(); // Print name, datatypes, access modifiers and values of the varibales of the specified class for(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
- Dobio sam sve metapodatke varijabli u nizu polja
- Ispisana sva imena varijabli u klasi Guru99VariableMetaData.class
- Ispisani su svi tipovi podataka varijabli u klasi Guru99VariableMetaData.class
- Ispisani su svi modifikatori pristupa varijabli u klasi Guru99VariableMetaData.class
- Ispisane vrijednosti svih varijabli u Ispisani su svi tipovi podataka varijabli u klasi Guru99VariableMetaData.class
-
Stvorite objekt klase gornje klase, tj. Guru99MethodMetaData.class kao ispod:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData (); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
Dohvatite informacije o metodi u polju Method pomoću metode getMethods() i getDeclaredMethods() kao 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 svoje super klase.
getDeclaredMethods() metoda vraća metapodatke svih metoda samo iz navedene klase.
- Dobijte naziv metode pomoću getName () metoda.
- Dobijte vrstu povrata metode koja koristi getReturnType() metoda.
- Dobijte modifikatore pristupa metodama koje koristite getModifiers() i Modifiers.toString(int i) metode.
- Dohvatite vrste parametara metode pomoću getParameterTypes() metoda koja vraća niz klasa.
-
Dobiti iznimku pomoću getExceptionTypes() metoda koja vraća niz klasa.
- Stvoren objekt klase za Guru99MethodMetaData.class
- Dobio sam sve metapodatke svih metoda u nizu metoda
- Ispisana su sva imena metoda prisutna u klasi Guru99MethodMetaData.class
- Ispisani povratni tipovi metoda u klasi Guru99MethodMetaData.class
- Ispisani su svi modifikatori pristupa metodama u klasi Guru99MethodMetaData.class
- Ispisani tipovi parametara metoda u Guru99MethodMetaData.class
-
Ispisane iznimke izbacuju metode u Guru99MethodMetaData.class
- Stvoren objekt klase za Guru99Constructor.class
- Dobio sam sve metapodatke svih konstruktora u nizu konstruktora
- Ispisuje sva imena konstruktora prisutna u klasi Guru99Constructor.class
- Ispisani su svi modifikatori pristupa konstruktora u klasi Guru99Constructor.class
- Ispisani tipovi parametara konstruktora u Guru99Constructor.class
- Ispisane iznimke izbacuju konstruktori u Guru99Constructor.class
- Refleksijsko programiranje u Javi pomaže u dohvaćanju i modificiranju informacija o klasama i članovima klase kao što su varijable, metode, konstruktori.
- Reflection API u Java može se implementirati korištenjem klasa u paketu java.lang.reflect i metodama 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 Polje, Metoda, Konstruktor, Modifikator itd.
- Reflection API može pristupiti privatnim metodama i varijablama klase koje bi mogle biti sigurnosna prijetnja.
- Reflection API moćna je mogućnost koju pruža Java, ali dolazi s nekim troškovima kao što su sporije performanse, sigurnosna ranjivost i problem s dozvolama. Stoga API refleksije treba tretirati kao posljednje sredstvo za izvođenje operacije.
Primjer 3: Kako dobiti metapodatke metode
Sljedeći primjeri pokazuju kako dobiti metapodatke 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 za dobivanje metapodataka 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.class class 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 names System.out.println("Name of the method : "+method.getName()); // Print return type of the methods System.out.println("Return type of the method : "+method.getReturnType()); //Get the access modifier list and print int guru99ModifierList = method.getModifiers(); System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList)); // Get and print parameters of the methods Class[] 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 method Class[] 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 dobiti metapodatke 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.class Class guru99Class=Guru99Constructor.class; // Get all the constructor information in the Constructor array Constructor[] guru99ConstructorList = guru99Class.getConstructors(); for (Constructor constructor : guru99ConstructorList) { // Print all name of each constructor System.out.println("Constrcutor name : "+constructor.getName()); //Get and print access modifiers of each constructor int guru99Modifiers= constructor.getModifiers(); System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers)); // Get and print parameter types Class[] 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 constructors Class[] 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("*******************************************"); } } }