जावा में प्रतिबिंब क्या है?
जावा परावर्तन रनटाइम पर एक वर्ग की सभी क्षमताओं का विश्लेषण और संशोधन करने की प्रक्रिया है। जावा में परावर्तन एपीआई का उपयोग वर्ग और उसके सदस्यों को हेरफेर करने के लिए किया जाता है जिसमें रनटाइम पर फ़ील्ड, विधियाँ, कंस्ट्रक्टर आदि शामिल होते हैं।
जावा में प्रतिबिंब एपीआई का एक फायदा यह है कि यह कक्षा के निजी सदस्यों को भी हेरफेर कर सकता है।
Java.lang.reflect पैकेज प्रतिबिंब java को लागू करने के लिए कई कक्षाएं प्रदान करता है। java.lang.Class वर्ग के मैथोड्स का उपयोग किसी विशेष वर्ग के पूर्ण मेटाडेटा को इकट्ठा करने के लिए किया जाता है।
इस ट्यूटोरियल में, आप सीखेंगे-
- प्रतिबिंब क्या है
- Java.lang.reflect पैकेज में कक्षा
- Java.lang.Class में उपयोग की जाने वाली विधियाँ
- किसी कक्षा के बारे में पूरी जानकारी कैसे प्राप्त करें
- उदाहरण 1: कक्षा का मेटाडेटा कैसे प्राप्त करें
- उदाहरण 2: चर का मेटाडेटा कैसे प्राप्त करें
- उदाहरण 3: विधि का मेटाडेटा कैसे प्राप्त करें
- उदाहरण 4: कंस्ट्रक्टर्स का मेटाडेटा कैसे प्राप्त करें
Java.lang.reflect पैकेज में कक्षा
प्रतिबिंब को लागू करने के लिए 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() methodClass c1 = Class.forName("Guru99ClassObjectCreation");//2- By using getClass() methodGuru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation();Class c2 = guru99Obj.getClass();//3- By using .classClass c3= Guru99ClassObjectCreation.class;}}
उदाहरण 1: कक्षा का मेटाडेटा कैसे प्राप्त करें
निम्नलिखित उदाहरण से पता चलता है कि मेटाडेटा कैसे प्राप्त करें जैसे: वर्ग का नाम, सुपर क्लास का नाम, कार्यान्वित किए गए इंटरफ़ेस, और किसी कक्षा के एक्सेस संशोधक।
हमें निम्न श्रेणी का मेटाडेटा मिलेगा जिसका नाम Guru99Base.class है:
import java.io.Serializable;public abstract class Guru99Base implements Serializable,Cloneable {}
- वर्ग का नाम है: गुरु99बेस
- यह एक्सेस संशोधक हैं: सार्वजनिक और सार
- इसने इंटरफेस लागू किया है: सीरियल करने योग्य और क्लोन करने योग्य
- चूंकि इसने स्पष्ट रूप से किसी भी वर्ग का विस्तार नहीं किया है, यह सुपर क्लास है: 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));}}
- getName विधि का उपयोग करके वर्ग का नाम प्रिंट करें
- GetSuperClass ()। GetName () विधि का उपयोग करके सुपर क्लास का नाम प्रिंट करें
- लागू इंटरफेस का नाम प्रिंट करें
- क्लास द्वारा उपयोग किए जाने वाले एक्सेस मॉडिफायर को प्रिंट करें
उदाहरण 2: चर का मेटाडेटा कैसे प्राप्त करें
निम्नलिखित उदाहरण दिखाता है कि चर का मेटाडेटा कैसे प्राप्त करें:
यहाँ, हम एक वर्ग बना रहे हैं जिसका नाम है गुरु९ वैरिएबलमेटाडाटा .क्लास जिसमें कुछ चर हैं:
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 guru99ClassVar = new Guru99VariableMetaData();Class guru99ClassObjVar = guru99ClassVar.getClass();
- का उपयोग कर क्षेत्र सरणी के रूप में मेटाडाटा जाओ getFields () या getDeclaredFields () नीचे के रूप में विधि:
Field[] guru99Field1= guru99ClassObjVar .getFields();Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();
getFields () विधि निर्दिष्ट वर्ग से सार्वजनिक चर के मेटाडेटा के साथ-साथ उसके सुपर क्लास से भी रिटर्न करती है।
getDeclaredFields () विधि केवल निर्दिष्ट वर्ग से सभी चर के मेटाडेटा देता है।
- "सार्वजनिक स्ट्रिंग getName ()" विधि का उपयोग करके चर का नाम प्राप्त करें।
- "सार्वजनिक वर्ग getType ()" विधि का उपयोग करके चर का डेटाटाइप प्राप्त करें।
- "सार्वजनिक xxx प्राप्त (फ़ील्ड)" विधि का उपयोग करके चर का मूल्य प्राप्त करें।
यहां, xxx एक बाइट या किसी भी प्रकार का मूल्य हो सकता है जिसे हम लाना चाहते हैं।
- GetModifier () और Modifier.toString (int i) विधियों का उपयोग करके चरों के एक्सेस मॉडिफायर प्राप्त करें।
यहाँ, हम क्लास में उपस्थित चर का मेटाडेटा पाने के लिए एक क्लास लिख रहे हैं।
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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ;}}}
- Guru99VariableMetaData.class के लिए क्लास ऑब्जेक्ट बनाया गया
- किसी फ़ील्ड सरणी में चर के सभी मेटाडेटा प्राप्त करें
- वर्ग के सभी नामों को मुद्रित किया गया है
- वर्ग के सभी डेटा प्रकारों को मुद्रित किया गया है Guru99VariableMetaData.class
- वर्ग के सभी एक्सेस मॉडिफायर्स को मुद्रित किया गया है गुरु99 वेरिएबल मैटाडाटा.क्लास में
- सभी प्रकारों के प्रिंट किए गए मानों को मुद्रित किया गया है गुरुद्वारे में सभी प्रकार के डेटा प्रकार
- उपरोक्त वर्ग की कक्षा वस्तु बनाएं।
Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData ();Class guru99ClassObjVar = guru99ClassVar.getClass();
- GetMethods () और getDeclaredMethods () विधि का उपयोग करके विधि सरणी में विधि की जानकारी प्राप्त करें:
Method[] guru99 Method 1= guru99ClassObjVar .get Methods();Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();
getMethods () विधि निर्दिष्ट वर्ग से सार्वजनिक विधियों के मेटाडेटा के साथ-साथ उसके सुपर क्लास से भी रिटर्न करती है।
getDeclaredMethods () विधि केवल निर्दिष्ट वर्ग से सभी विधियों का मेटाडेटा लौटाती है।
- GetName () विधि का उपयोग करके विधि का नाम प्राप्त करें ।
- GetReturnType () विधि का उपयोग करके वापसी प्रकार प्राप्त करें ।
- GetModifiers () और Modifiers.toString (int i) विधियों का उपयोग करते हुए तरीकों के एक्सेस मोडिफायर प्राप्त करें ।
- GetParameterTypes () पद्धति का उपयोग करके विधि पैरामीटर प्रकार प्राप्त करें जो एक श्रेणी सरणी देता है।
- GetExceptionTypes () पद्धति का उपयोग करके फेंक दिया गया अपवाद प्राप्त करें जो वर्ग सरणी देता है।
- Guru99MethodMetaData.class के लिए क्लास ऑब्जेक्ट बनाया गया
- एक विधि सरणी में सभी विधियों के सभी मेटाडेटा मिला
- क्लास में मौजूद सभी विधि नामों को मुद्रित किया गया है
- कक्षा में वापस लौटे तरीकों के प्रकार गुरु 99MethodMetaData.class
- क्लास के सभी एक्सेस मॉडिफ़ाइटरों को क्लास गुरु99 मेथोड्मेटडाटा.क्लास में प्रिंट किया
- Gur99MethodMetaData.class में विधियों के मुद्रित पैरामीटर प्रकार
- Gur99MethodMetaData.class में विधियों द्वारा मुद्रित अपवाद फेंके गए हैं
- Guru99Constructor.class के लिए क्लास ऑब्जेक्ट बनाया गया
- एक कंस्ट्रक्टर सरणी में सभी कंस्ट्रक्टर के सभी मेटाडेटा मिला
- क्लास के सभी कंस्ट्रक्टर के नाम गुरुपूनोकस्ट्रक्टर.क्लास में छपे
- क्लास के सभी कंस्ट्रक्टर्स के एक्सेस मॉडिफायर्स को मुद्रित किया गया है
- गुरु99Constructor.class में कंस्ट्रक्टर्स के मुद्रित पैरामीटर प्रकार
- गुरु99Constructor.class में निर्माणकर्ताओं द्वारा मुद्रित अपवाद फेंके गए हैं
- जावा में परावर्तन प्रोग्रामिंग कक्षा और कक्षा सदस्यों जैसे चर, विधियों, निर्माणकर्ताओं के बारे में जानकारी प्राप्त करने और संशोधित करने में मदद करता है।
- जावा में प्रतिबिंब एपीआई को java.lang.reflect पैकेज और java.lang.Clang वर्ग के तरीकों का उपयोग करके कार्यान्वित किया जा सकता है।
- Java.lang.Class वर्ग के कुछ आमतौर पर उपयोग किए जाने वाले तरीके हैं getName (), getSuperclass (), getInterfaces (), getModifiers () आदि।
- Java.lang.reflect पैकेज में कुछ सामान्य रूप से उपयोग की जाने वाली कक्षाएं फील्ड, मेथड, कंस्ट्रक्टर, संशोधक आदि हैं।
- प्रतिबिंब एपीआई एक कक्षा के निजी तरीकों और चर तक पहुंच सकता है जो एक सुरक्षा खतरा हो सकता है।
- परावर्तन एपीआई जावा द्वारा प्रदान की गई एक शक्तिशाली क्षमता है, लेकिन यह कुछ ओवरहेड्स जैसे धीमे प्रदर्शन, सुरक्षा भेद्यता और अनुमति मुद्दे के साथ आता है। इसलिए, प्रतिबिंब एपीआई को ऑपरेशन करने के लिए अंतिम उपाय के रूप में माना जाना चाहिए।
उदाहरण 3: विधि का मेटाडेटा कैसे प्राप्त करें
निम्नलिखित उदाहरणों से पता चलता है कि विधि का मेटाडेटा कैसे प्राप्त करें:
यहां, हम कुछ तरीकों के साथ, गुरु 99MethodMetaData .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");}}
उपरोक्त कक्षा में विधियों के बारे में मेटाडेटा प्राप्त करने के लिए कदम:
यहाँ, हम क्लास गुरु99MethodMetaData में मौजूद विधियों का मेटाडेटा प्राप्त करने के लिए एक क्लास लिख रहे हैं।
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("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");}}}
उदाहरण 4: रचनाकारों की मेटाडेटा कैसे प्राप्त करें
निम्नलिखित उदाहरणों से पता चलता है कि निर्माणकर्ताओं के मेटाडेटा कैसे प्राप्त करें:
यहां, हम विभिन्न कंस्ट्रक्टर्स के साथ गुरु 99 कस्ट्रोस्टर.क्लास नामक एक क्लास बना रहे हैं:
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{ }}
यहाँ, हम क्लास में उपस्थित कंस्ट्रक्टरों के मेटाडेटा पाने के लिए एक क्लास लिख रहे हैं।
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("*******************************************");}}}
सारांश: