Java Tutorial Reflection API cu exemplu
รn ce este Reflecศia Java?
Java Reflecศia este procesul de analizฤ ศi modificare a tuturor capabilitฤศilor unei clase รฎn timpul execuศiei. Reflection API รฎn Java este folosit pentru a manipula clasa ศi membrii acesteia, care includ cรขmpuri, metode, constructor etc. รฎn timpul execuศiei.
Un avantaj al reflection API รฎn Java adicฤ poate manipula ศi membrii privaศi ai clasei.
Pachetul java.lang.reflect oferฤ multe clase pentru a implementa reflectarea java.Metodele clasei java.lang.Class sunt folosite pentru a aduna metadatele complete ale unei anumite clase.
Clasฤ รฎn pachetul java.lang.reflect
รn continuare este o listฤ de diverse Java clase รฎn java.lang.package pentru a implementa reflection-
- Cรขmp: Aceastฤ clasฤ este folositฤ pentru a colecta informaศii declarative, cum ar fi tipul de date, modificatorul de acces, numele ศi valoarea unei variabile.
- Metodฤ: Aceastฤ clasฤ este folositฤ pentru a aduna informaศii declarative, cum ar fi modificatorul de acces, tipul de returnare, numele, tipurile de parametri ศi tipul de excepศie al unei metode.
- Constructor: Aceastฤ clasฤ este folositฤ pentru a aduna informaศii declarative, cum ar fi modificatorul de acces, tipurile de nume ศi parametri ale unui constructor.
- Modificatorul: Aceastฤ clasฤ este folositฤ pentru a aduna informaศii despre un anumit modificator de acces.
Metode utilizate รฎn java.lang.Class
- ศir public getName (): Returneazฤ numele clasei.
- clasฤ publicฤ getSuperclass(): Returneazฤ referinศa super-clasฤ
- Clasa publicฤ[] getInterfaces() : Returneazฤ o serie de interfeศe implementate de clasa specificatฤ
-
Public รฎn getModifiers (): Returneazฤ o valoare รฎntreagฤ reprezentรขnd modificatorii clasei specificate care trebuie sฤ fie transmisฤ ca parametru la โpublic static String toString (int i )โ metoda care returneazฤ specificatorul de acces pentru clasa datฤ.
Cum sฤ obศineศi informaศii complete despre o clasฤ
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;
}
}
Exemplul 1: Cum sฤ obศineศi metadatele clasei
Urmฤtorul exemplu aratฤ cum sฤ obศineศi metadate, cum ar fi: numele clasei, numele superclasei, interfeศele implementate ศi modificatorii de acces ai unei clase.
Vom obศine metadatele clasei de mai jos numite Guru99Base.class:
import java.io.Serializable;
public abstract class Guru99Base implements Serializable,Cloneable {
}
- Numele clasei este: Guru99Base
- Modificatorii de acces sunt: โโpublic ศi abstract
- Are interfeศe implementate: Serializabil ศi Clonabil
- Deoarece nu a extins nicio clasฤ รฎn mod explicit, super-clasa este: java.lang.Object
Clasa de mai jos va obศine metadatele Guru99Base.class ศi le va imprima:
import java.lang.reflect.Modifier;
public class Guru99GetclassMetaData {
public static void main (String [] args) throws ClassNotFoundException {
// Create Class object for Guru99Base.class
Class guru99ClassObj = 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));
}
}
- tipฤriศi numele clasei folosind metoda getName
- Tipฤriศi numele superclasei folosind metoda getSuperClass().getName().
- Tipฤriศi numele interfeศelor implementate
- Tipฤriศi modificatorii de acces folosiศi de clasฤ
Exemplul 2: Cum sฤ obศineศi metadatele variabilei
Urmฤtoarele exemple aratฤ cum sฤ obศineศi metadatele variabilei:
Aici, creฤm o clasฤ numitฤ Guru99VariableMetaData .class cu cรขteva variabile:
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";
}
-
Creaศi obiectul clasei din clasa de mai sus, adicฤ Guru99VariableMetaData.class ca mai jos:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
Obศineศi metadatele sub formฤ de matrice de cรขmp folosind getFields() or getDeclaredFields() metode dupฤ cum urmeazฤ:
Field[] guru99Field1= guru99ClassObjVar .getFields(); Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
getFields() metoda returneazฤ metadatele variabilei publice din clasa specificatฤ, precum ศi din superclasa acesteia.
getDeclaredFields() metoda returneazฤ metadatele tuturor variabilelor din clasa specificatฤ.
- Obศineศi numele variabilelor folosind metoda โpublic String getName()โ.
- Obศineศi tipul de date al variabilelor folosind metoda โpublic Class getType()โ.
-
Obศineศi valoarea variabilei folosind metoda โpublic xxx get (Field)โ.
Aici, xxx ar putea fi un octet sau scurt de orice tip de valoare pe care dorim sฤ o obศinem.
-
Obศineศi modificatorii de acces ai variabilelor folosind metodele getModifier() ศi Modifier.toString(int i).
Aici scriem o clasฤ pentru a obศine metadatele variabilelor prezente รฎn clasa 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ; } } } - Obiect de clasฤ creat pentru Guru99VariableMetaData.class
- Am primit toate metadatele variabilelor dintr-o matrice Field
- S-au imprimat toate numele variabilelor din clasa Guru99VariableMetaData.class
- S-au imprimat toate tipurile de date ale variabilelor din clasa Guru99VariableMetaData.class
- S-au imprimat toศi modificatorii de acces ai variabilelor din clasa Guru99VariableMetaData.class
- Imprimate valorile tuturor variabilelor din Imprimarea tuturor tipurilor de date ale variabilelor din clasa Guru99VariableMetaData.class
-
Creaศi obiectul clasei din clasa de mai sus, adicฤ Guru99MethodMetaData.class ca mai jos:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData (); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
Obศineศi informaศii despre metodฤ รฎntr-o matrice Method folosind metoda getMethods() ศi getDeclaredMethods(), dupฤ cum urmeazฤ:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods(); Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
getMethods() metoda returneazฤ metadatele metodelor publice din clasa specificatฤ, precum ศi din superclasa acesteia.
getDeclaredMethods() metoda returneazฤ metadatele tuturor metodelor numai din clasa specificatฤ.
- Obศineศi numele metodei folosind getName () metodฤ.
- Obศineศi tipul de returnare al metodei folosind getReturnType() metodฤ.
- Obศineศi modificatori de acces ai metodelor folosind getModifiers() ศi Modifiers.toString(int i) metode.
- Obศine tipuri de parametri de metodฤ folosind getParameterTypes() metodฤ care returneazฤ o matrice de clasฤ.
-
Obศineศi excepศie folosind getExceptionTypes() metodฤ care returneazฤ o matrice de clasฤ.
- Obiect de clasฤ creat pentru Guru99MethodMetaData.class
- Am primit toate metadatele tuturor metodelor dintr-o matrice Method
- S-au imprimat toate numele metodelor prezente รฎn clasa Guru99MethodMetaData.class
- Tipuri de returnare tipฤrite ale metodelor din clasa Guru99MethodMetaData.class
- S-au imprimat toศi modificatorii de acces ai metodelor din clasa Guru99MethodMetaData.class
- Tipuri de parametri imprimate ale metodelor din Guru99MethodMetaData.class
-
Excepศiile tipฤrite sunt aruncate de metodele din Guru99MethodMetaData.class
- Obiect de clasฤ creat pentru Guru99Constructor.class
- Am primit toate metadatele tuturor constructorilor dintr-o matrice Constructor
- S-au imprimat toate numele constructorilor prezente รฎn clasa Guru99Constructor.class
- S-au imprimat toศi modificatorii de acces ai constructorilor din clasa Guru99Constructor.class
- Tipuri de parametri imprimate ale constructorilor din Guru99Constructor.class
- Excepศiile tipฤrite sunt aruncate de constructori รฎn Guru99Constructor.class
- Programarea prin reflectare รฎn java ajutฤ la preluarea ศi modificarea informaศiilor despre clase ศi membrii clasei, cum ar fi variabile, metode, constructori.
- Reflection API รฎn Java poate fi implementat folosind clase din pachetul java.lang.reflect ศi metodele clasei java.lang.Class.
- Unele metode frecvent utilizate ale clasei java.lang.Class sunt getName (), getSuperclass (), getInterfaces (), getModifiers () etc.
- Unele clase utilizate รฎn mod obiศnuit รฎn pachetul java.lang.reflect sunt Cรขmp, Metodฤ, Constructor, Modificator etc.
- Reflection API poate accesa metode private ศi variabile ale unei clase care ar putea reprezenta o ameninศare de securitate.
- Reflection API este o capacitate puternicฤ oferitฤ de Java, dar vine cu unele cheltuieli generale, cum ar fi performanศฤ mai lentฤ, vulnerabilitate de securitate ศi probleme de permisiuni. Prin urmare, reflection API ar trebui tratat ca ultima soluศie pentru a efectua o operaศie.
Exemplul 3: Cum sฤ obศineศi metadatele metodei
Urmฤtoarele exemple aratฤ cum sฤ obศineศi metadatele unei metode:
Aici, creฤm o clasฤ numitฤ Guru99MethodMetaData .class cu unele metode
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");
}
}
Paศi pentru a obศine metadatele despre metodele din clasa de mai sus:
Aici scriem o clasฤ pentru a obศine metadatele metodelor prezente รฎn clasa 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");
}
}
}
Exemplul 4: Cum sฤ obศineศi metadatele constructorilor
Urmฤtoarele exemple aratฤ cum sฤ obศineศi metadatele constructorilor:
Aici, creฤm o clasฤ numitฤ Guru99Constructor.class cu diferiศi constructori:
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{ }
}
Aici scriem o clasฤ pentru a obศine metadatele constructorilor prezenศi รฎn clasa 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("*******************************************");
}
}
}
















