Java उदाहरण के साथ रिफ्लेक्शन एपीआई ट्यूटोरियल
प्रतिबिंब क्या है? Java?
Java रिफ्लेक्शन रनटाइम पर किसी क्लास की सभी क्षमताओं का विश्लेषण और संशोधन करने की प्रक्रिया है। Java इसका उपयोग रनटाइम पर क्लास और उसके सदस्यों, जिसमें फ़ील्ड, विधियां, कन्स्ट्रक्टर आदि शामिल हैं, को नियंत्रित करने के लिए किया जाता है।
रिफ्लेक्शन एपीआई का एक फायदा यह है Java यह वर्ग के निजी सदस्यों में भी हेरफेर कर सकता है।
java.lang.reflect पैकेज रिफ्लेक्शन जावा को कार्यान्वित करने के लिए कई क्लासेस प्रदान करता है। java.lang.Class क्लास के तरीकों का उपयोग किसी विशेष क्लास के संपूर्ण मेटाडेटा को इकट्ठा करने के लिए किया जाता है।
java.lang.reflect पैकेज में क्लास
निम्नलिखित की एक सूची है विभिन्न Java कक्षाएं java.lang.package में प्रतिबिंब को लागू करने के लिए-
- क्षेत्रइस वर्ग का उपयोग किसी चर की घोषणात्मक जानकारी जैसे डेटाटाइप, एक्सेस संशोधक, नाम और मान एकत्र करने के लिए किया जाता है।
- विधिइस वर्ग का उपयोग किसी विधि की घोषणात्मक जानकारी जैसे एक्सेस संशोधक, रिटर्न प्रकार, नाम, पैरामीटर प्रकार और अपवाद प्रकार को इकट्ठा करने के लिए किया जाता है।
- निर्माताइस वर्ग का उपयोग कन्स्ट्रक्टर के एक्सेस संशोधक, नाम और पैरामीटर प्रकार जैसी घोषणात्मक जानकारी एकत्र करने के लिए किया जाता है।
- संशोधक: इस वर्ग का उपयोग किसी विशेष एक्सेस संशोधक के बारे में जानकारी एकत्र करने के लिए किया जाता है।
java.lang.Class में प्रयुक्त विधियाँ
- सार्वजनिक स्ट्रिंग getName (): वर्ग का नाम लौटाता है.
- सार्वजनिक क्लास getSuperclass(): सुपर क्लास संदर्भ लौटाता है
- पब्लिक क्लास[] getInterfaces() : निर्दिष्ट वर्ग द्वारा कार्यान्वित इंटरफेस की एक सरणी लौटाता है
-
getModifiers () में सार्वजनिक: निर्दिष्ट वर्ग के संशोधकों का प्रतिनिधित्व करने वाला एक पूर्णांक मान लौटाता है जिसे पैरामीटर के रूप में पास किया जाना चाहिए “सार्वजनिक स्थैतिक स्ट्रिंग toString (int i)” विधि जो दिए गए वर्ग के लिए एक्सेस विनिर्देशक लौटाती है।
किसी क्लास के बारे में पूरी जानकारी कैसे प्राप्त करें
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; } }
उदाहरण 1 : क्लास का मेटाडेटा कैसे प्राप्त करें
निम्न उदाहरण दिखाता है कि मेटाडेटा कैसे प्राप्त करें जैसे: क्लास का नाम, सुपर क्लास का नाम, कार्यान्वित इंटरफेस, और क्लास के एक्सेस संशोधक।
हमें नीचे दिए गए Guru99Base.class नामक क्लास का मेटाडेटा मिलेगा:
import java.io.Serializable; public abstract class Guru99Base implements Serializable,Cloneable { }
- क्लास का नाम है: Guru99Base
- इसके एक्सेस संशोधक हैं: सार्वजनिक और सार
- इसमें इंटरफेस लागू किए गए हैं: Serializable और Cloneable
- चूंकि इसने किसी भी क्लास को स्पष्ट रूप से विस्तारित नहीं किया है, इसलिए इसका सुपर क्लास है: java.lang.Object
नीचे दिया गया वर्ग Guru99Base.class का मेटा डेटा प्राप्त करेगा और उसे प्रिंट करेगा:
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)); } }
- getName विधि का उपयोग करके क्लास का नाम प्रिंट करें
- getSuperClass().getName() विधि का उपयोग करके सुपर क्लास का नाम प्रिंट करें
- कार्यान्वित इंटरफेस का नाम प्रिंट करें
- क्लास द्वारा उपयोग किए गए एक्सेस संशोधक प्रिंट करें
उदाहरण 2 : वेरिएबल का मेटाडेटा कैसे प्राप्त करें
निम्न उदाहरण दिखाता है कि चर का मेटाडेटा कैसे प्राप्त करें:
यहाँ, हम कुछ चरों के साथ Guru99VariableMetaData .class नामक एक क्लास बना रहे हैं:
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"; }
-
उपरोक्त क्लास का क्लास ऑब्जेक्ट बनाएं अर्थात Guru99VariableMetaData.class नीचे दिए अनुसार:
Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
फ़ील्ड सरणी के रूप में मेटाडेटा प्राप्त करें फ़ील्ड प्राप्त करें() or getDeclaredFields() नीचे दिए गए तरीके:
Field[] guru99Field1= guru99ClassObjVar .getFields(); Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
फ़ील्ड प्राप्त करें() विधि निर्दिष्ट वर्ग के साथ-साथ उसके सुपर क्लास से सार्वजनिक चर का मेटाडेटा लौटाती है।
getDeclaredFields() विधि केवल निर्दिष्ट वर्ग से सभी चरों का मेटाडेटा लौटाती है।
- “public String getName()” विधि का उपयोग करके चरों का नाम प्राप्त करें।
- “public Class getType()” विधि का उपयोग करके चरों का डेटाटाइप प्राप्त करें।
-
“public xxx get (Field)” विधि का उपयोग करके वेरिएबल का मान प्राप्त करें।
यहां, xxx किसी भी प्रकार के मान का एक बाइट या छोटा भाग हो सकता है जिसे हम प्राप्त करना चाहते हैं।
-
getModifier() और Modifier.toString(int i) विधियों का उपयोग करके चरों के एक्सेस संशोधक प्राप्त करें।
यहाँ, हम 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ; } } }
- Guru99VariableMetaData.class के लिए क्लास ऑब्जेक्ट बनाया गया
- फ़ील्ड सरणी में चरों का सभी मेटाडेटा प्राप्त हुआ
- गुरु99VariableMetaData.class वर्ग में सभी चर नाम मुद्रित किए गए
- गुरु99VariableMetaData.class वर्ग में चरों के सभी डेटा प्रकारों को मुद्रित किया गया
- गुरु99VariableMetaData.class वर्ग में चरों के सभी एक्सेस संशोधक मुद्रित किए गए
- गुरु99VariableMetaData.class वर्ग में सभी चरों के मान मुद्रित किए गए। गुरुXNUMXVariableMetaData.class वर्ग में सभी चरों के डेटा प्रकार मुद्रित किए गए।
-
उपरोक्त क्लास का क्लास ऑब्जेक्ट बनाएं अर्थात Guru99MethodMetaData.class नीचे दिए अनुसार:
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData (); Class guru99ClassObjVar = guru99ClassVar.getClass();
-
नीचे दिए अनुसार getMethods() और getDeclaredMethods() विधि का उपयोग करके Method array में विधि जानकारी प्राप्त करें:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods(); Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
विधियाँ प्राप्त करें() विधि निर्दिष्ट वर्ग के साथ-साथ उसके सुपर क्लास से सार्वजनिक विधियों का मेटाडेटा लौटाती है।
getDeclaredMethods() विधि केवल निर्दिष्ट वर्ग से सभी विधियों का मेटाडेटा लौटाती है।
- विधि का नाम प्राप्त करें getName () विधि.
- विधि का उपयोग करके रिटर्न प्रकार प्राप्त करें getReturnType() विधि.
- उपयोग करने वाले तरीकों के एक्सेस संशोधक प्राप्त करें संशोधक प्राप्त करें() और संशोधक.toString(int i) तरीकों.
- विधि पैरामीटर प्रकार प्राप्त करें getपैरामीटरटाइप्स() विधि जो एक वर्ग सरणी लौटाती है.
-
अपवाद का उपयोग करके फेंका गया getExceptionTypes() विधि जो एक वर्ग सरणी लौटाती है.
- Guru99MethodMetaData.class के लिए क्लास ऑब्जेक्ट बनाया गया
- विधि सरणी में सभी विधियों का संपूर्ण मेटाडेटा प्राप्त हुआ
- गुरु99MethodMetaData.class वर्ग में मौजूद सभी विधि नामों को मुद्रित किया गया
- गुरु99MethodMetaData.class वर्ग में विधियों के मुद्रित रिटर्न प्रकार
- गुरु99MethodMetaData.class वर्ग में विधियों के सभी एक्सेस संशोधक मुद्रित किए गए
- Guru99MethodMetaData.class में विधियों के मुद्रित पैरामीटर प्रकार
-
मुद्रित अपवाद Guru99MethodMetaData.class में विधियों द्वारा फेंके जाते हैं
- Guru99Constructor.class के लिए क्लास ऑब्जेक्ट बनाया गया
- कंस्ट्रक्टर सरणी में सभी कंस्ट्रक्टरों का संपूर्ण मेटाडेटा प्राप्त किया गया
- गुरु99Constructor.class वर्ग में उपस्थित सभी कन्स्ट्रक्टर के नाम मुद्रित किए गए
- गुरु99Constructor.class वर्ग में कंस्ट्रक्टर्स के सभी एक्सेस संशोधक मुद्रित किए गए
- Guru99Constructor.class में कंस्ट्रक्टर्स के मुद्रित पैरामीटर प्रकार
- मुद्रित अपवाद गुरु99Constructor.class में कंस्ट्रक्टर द्वारा फेंके जाते हैं
- जावा में रिफ्लेक्शन प्रोग्रामिंग क्लासेस और क्लास सदस्यों जैसे वेरिएबल, मेथड्स, कंस्ट्रक्टर्स के बारे में जानकारी प्राप्त करने और संशोधित करने में मदद करती है।
- प्रतिबिंब एपीआई Java java.lang.reflect पैकेज में कक्षाओं और java.lang.Class वर्ग के तरीकों का उपयोग करके कार्यान्वित किया जा सकता है।
- Java.lang.Class वर्ग की कुछ सामान्यतः प्रयुक्त विधियाँ हैं getName (), getSuperclass (), getInterfaces (), getModifiers () आदि।
- Java.lang.reflect पैकेज में कुछ सामान्यतः प्रयुक्त क्लासेस हैं फील्ड, मेथड, कंस्ट्रक्टर, मॉडिफायर, आदि।
- रिफ्लेक्शन एपीआई किसी क्लास की निजी विधियों और चरों तक पहुंच सकता है जो सुरक्षा के लिए खतरा हो सकता है।
- रिफ्लेक्शन एपीआई एक शक्तिशाली क्षमता है जो इसके द्वारा प्रदान की जाती है Java, लेकिन इसके साथ कुछ ओवरहेड्स भी आते हैं जैसे कि धीमा प्रदर्शन, सुरक्षा भेद्यता और अनुमति समस्या। इसलिए, रिफ्लेक्शन एपीआई को ऑपरेशन करने के लिए अंतिम उपाय के रूप में माना जाना चाहिए।
उदाहरण 3 : विधि का मेटाडेटा कैसे प्राप्त करें
निम्नलिखित उदाहरण दिखाता है कि किसी विधि का मेटाडेटा कैसे प्राप्त किया जाए:
यहाँ, हम कुछ विधियों के साथ 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"); } }
उपरोक्त वर्ग में विधियों के बारे में मेटाडेटा प्राप्त करने के चरण:
यहाँ, हम 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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "); } } }
उदाहरण 4 : कंस्ट्रक्टर्स का मेटाडेटा कैसे प्राप्त करें
निम्नलिखित उदाहरण दिखाता है कि कंस्ट्रक्टर्स का मेटाडेटा कैसे प्राप्त किया जाए:
यहां, हम विभिन्न कंस्ट्रक्टर्स के साथ Guru99Constructor.class नामक एक क्लास बना रहे हैं:
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{ } }
यहाँ, हम 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("*******************************************"); } } }