जावा परावर्तन (उदाहरणों के साथ)

इस ट्यूटोरियल में, हम प्रतिबिंब को सीखेंगे, जावा प्रोग्रामिंग में एक सुविधा जो हमें कक्षाओं, विधियों आदि का निरीक्षण करने और उन्हें संशोधित करने की अनुमति देती है।

जावा में, प्रतिबिंब हमें रन टाइम के दौरान कक्षाओं, इंटरफेस, कंस्ट्रक्टर, विधियों और क्षेत्रों का निरीक्षण और हेरफेर करने की अनुमति देता है।

जावा में एक वर्ग है जिसका नाम Classरनटाइम पर ऑब्जेक्ट्स और कक्षाओं के बारे में सभी जानकारी रखता है। प्रतिबिंब का प्रदर्शन करने के लिए कक्षा की वस्तु का उपयोग किया जा सकता है।

जावा कक्षाओं का प्रतिबिंब

जावा वर्ग को प्रतिबिंबित करने के लिए, हमें पहले कक्षा की एक वस्तु बनाने की आवश्यकता है।

और, ऑब्जेक्ट का उपयोग करके हम विभिन्न तरीकों को कॉल कर सकते हैं, ताकि क्लास में मौजूद तरीकों, फील्ड्स और कंस्ट्रक्टर के बारे में जानकारी मिल सके।

कक्षा की वस्तुओं को बनाने के तीन तरीके मौजूद हैं:

1. forName () मेथड का प्रयोग

 class Dog (… ) // create object of Class // to reflect the Dog class Class a = Class.forName("Dog");

यहाँ, forName()विधि वर्ग के नाम को उसके तर्क के रूप में परिलक्षित करती है।

2. getClass () विधि का उपयोग करना

 // create an object of Dog class Dog d1 = new Dog(); // create an object of Class // to reflect Dog Class b = d1.getClass();

यहां, हम क्लास का ऑब्जेक्ट बनाने के लिए डॉग क्लास के ऑब्जेक्ट का उपयोग कर रहे हैं।

3. .class एक्सटेंशन का उपयोग करना

 // create an object of Class // to reflect the Dog class Class c = Dog.class;

अब जब हम जानते हैं कि हम कैसे वस्तुओं का निर्माण कर सकते हैं Class। हम रनटाइम पर संबंधित वर्ग के बारे में जानकारी प्राप्त करने के लिए इस ऑब्जेक्ट का उपयोग कर सकते हैं।

उदाहरण: जावा क्लास परावर्तन

 import java.lang.Class; import java.lang.reflect.*; class Animal ( ) // put this class in different Dog.java file public class Dog extends Animal ( public void display() ( System.out.println("I am a dog."); ) ) // put this in Main.java file class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // get name of the class String name = obj.getName(); System.out.println("Name: " + name); // get the access modifier of the class int modifier = obj.getModifiers(); // convert the access modifier to string String mod = Modifier.toString(modifier); System.out.println("Modifier: " + mod); // get the superclass of Dog Class superClass = obj.getSuperclass(); System.out.println("Superclass: " + superClass.getName()); ) catch (Exception e) ( e.printStackTrace(); ) ) )

आउटपुट

 नाम: डॉग संशोधक: सार्वजनिक सुपरक्लास: पशु

उपरोक्त उदाहरण में, हमने एक सुपरक्लास बनाया है: पशु और एक उपवर्ग: डॉग। यहां, हम क्लास डॉग का निरीक्षण करने की कोशिश कर रहे हैं।

कथन पर ध्यान दें,

 Class obj = d1.getClass();

यहां, हम getClass()विधि का उपयोग करके कक्षा का एक ऑब्जेक्ट obj बना रहे हैं । ऑब्जेक्ट का उपयोग करके, हम क्लास के विभिन्न तरीकों को बुला रहे हैं।

  • obj.getName () - वर्ग का नाम लौटाता है
  • obj.getModifiers () - वर्ग का एक्सेस संशोधक लौटाता है
  • obj.getSuperclass () - वर्ग का सुपर क्लास लौटाता है

इसके बारे में अधिक जानने के लिए Class, जावा क्लास (आधिकारिक जावा प्रलेखन) पर जाएँ।

नोट : हम Modifierपूर्णांक एक्सेस संशोधक को स्ट्रिंग में बदलने के लिए कक्षा का उपयोग कर रहे हैं ।

रिफ्लेक्टिंग फील्ड्स, मेथड्स, और कंस्ट्रक्टर्स

पैकेज java.lang.reflectऐसी कक्षाएं प्रदान करता है जिनका उपयोग कक्षा के सदस्यों को हेरफेर करने के लिए किया जा सकता है। उदाहरण के लिए,

  • विधि वर्ग - एक कक्षा में विधियों के बारे में जानकारी प्रदान करता है
  • फील्ड क्लास - एक क्लास में फील्ड के बारे में जानकारी प्रदान करता है
  • कंस्ट्रक्टर वर्ग - एक कक्षा में निर्माणकर्ताओं के बारे में जानकारी प्रदान करता है

1. जावा विधियों का प्रतिबिंब

Methodवर्ग के लिए विभिन्न तरीकों कि एक वर्ग में तरीकों वर्तमान के बारे में जानकारी प्राप्त करने के लिए इस्तेमाल किया जा सकता प्रदान करता है। उदाहरण के लिए,

 import java.lang.Class; import java.lang.reflect.*; class Dog ( // methods of the class public void display() ( System.out.println("I am a dog."); ) private void makeSound() ( System.out.println("Bark Bark"); ) ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // using object of Class to // get all the declared methods of Dog Method() methods = obj.getDeclaredMethods(); // create an object of the Method class for (Method m : methods) ( // get names of methods System.out.println("Method Name: " + m.getName()); // get the access modifier of methods int modifier = m.getModifiers(); System.out.println("Modifier: " + Modifier.toString(modifier)); // get the return types of method System.out.println("Return Types: " + m.getReturnType()); System.out.println(" "); ) ) catch (Exception e) ( e.printStackTrace(); ) ) )

आउटपुट

 विधि का नाम: प्रदर्शन संशोधक: सार्वजनिक रिटर्न प्रकार: शून्य विधि का नाम: मेकाउंड संशोधक: निजी रिटर्न प्रकार: शून्य

उपरोक्त उदाहरण में, हम डॉग क्लास में मौजूद तरीकों के बारे में जानकारी प्राप्त करने की कोशिश कर रहे हैं। जैसा कि पहले उल्लेख किया गया है, हमने पहले विधि का Classउपयोग करने के लिए ऑब्जेक्ट ऑब्जेक्ट बनाया है getClass()

अभिव्यक्ति पर ध्यान दें,

 Method() methods = obj.getDeclaredMethod();

यहां, getDeclaredMethod()क्लास के अंदर मौजूद सभी तरीकों को लौटाता है।

साथ ही, हमने Methodक्लास का एक ऑब्जेक्ट m बनाया है । यहाँ,

  • m.getName () - एक विधि का नाम देता है
  • m.getModifiers () - पूर्णांक रूप में विधियों का एक्सेस संशोधक लौटाता है
  • m.getReturnType () - रिटर्न प्रकार के तरीके

Methodवर्ग भी विभिन्न अन्य तरीकों कि रन टाइम पर तरीकों का निरीक्षण करने के लिए इस्तेमाल किया जा सकता है प्रदान करता है। अधिक जानने के लिए, जावा विधि वर्ग (आधिकारिक जावा प्रलेखन) पर जाएँ।

2. जावा फील्ड्स का प्रतिबिंब

विधियों की तरह, हम कक्षा के तरीकों का उपयोग करके कक्षा के विभिन्न क्षेत्रों का निरीक्षण और संशोधन भी कर सकते हैं Field। उदाहरण के लिए,

 import java.lang.Class; import java.lang.reflect.*; class Dog ( public String type; ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // access and set the type field Field field1 = obj.getField("type"); field1.set(d1, "labrador"); // get the value of the field type String typeValue = (String) field1.get(d1); System.out.println("Value: " + typeValue); // get the access modifier of the field type int mod = field1.getModifiers(); // convert the modifier to String form String modifier1 = Modifier.toString(mod); System.out.println("Modifier: " + modifier1); System.out.println(" "); ) catch (Exception e) ( e.printStackTrace(); ) ) )

आउटपुट

 मूल्य: लैब्राडोर संशोधक: सार्वजनिक

उपरोक्त उदाहरण में, हमने एक वर्ग बनाया है जिसका नाम डॉग है। इसमें सार्वजनिक क्षेत्र का नाम शामिल है। कथन पर ध्यान दें,

 Field field1 = obj.getField("type");

यहाँ, हम डॉग क्लास के पब्लिक फील्ड को एक्सेस कर रहे हैं और इसे फील्ड क्लास के ऑब्जेक्ट फील्ड 1 को असाइन कर रहे हैं।

हमने तब Fieldकक्षा के विभिन्न तरीकों का इस्तेमाल किया :

  • field1.set () - फ़ील्ड का मान सेट करता है
  • field1.get () - फ़ील्ड का मान लौटाता है
  • field1.getModifiers () - पूर्णांक रूप में फ़ील्ड का मान लौटाता है

इसी तरह, हम निजी क्षेत्रों में भी पहुँच बना सकते हैं और संशोधित कर सकते हैं। हालांकि, निजी क्षेत्र का प्रतिबिंब सार्वजनिक क्षेत्र की तुलना में थोड़ा अलग है। उदाहरण के लिए,

 import java.lang.Class; import java.lang.reflect.*; class Dog ( private String color; ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // access the private field color Field field1 = obj.getDeclaredField("color"); // allow modification of the private field field1.setAccessible(true); // set the value of color field1.set(d1, "brown"); // get the value of field color String colorValue = (String) field1.get(d1); System.out.println("Value: " + colorValue); // get the access modifier of color int mod2 = field1.getModifiers(); // convert the access modifier to string String modifier2 = Modifier.toString(mod2); System.out.println("Modifier: " + modifier2); ) catch (Exception e) ( e.printStackTrace(); ) ) )

आउटपुट

 मूल्य: भूरा संशोधक: निजी

उपरोक्त उदाहरण में, हमने एक वर्ग बनाया है जिसका नाम डॉग है। कक्षा में रंग नाम का एक निजी क्षेत्र होता है। कथन पर ध्यान दें।

 Field field1 = obj.getDeclaredField("color"); field1.setAccessible(true);

यहां, हम रंग को एक्सेस कर रहे हैं और इसे Fieldक्लास के ऑब्जेक्ट फील्ड 1 को असाइन कर रहे हैं । फिर हमने रंग की पहुंच को संशोधित करने के लिए फ़ील्ड 1 का उपयोग किया और हमें इसमें बदलाव करने की अनुमति देता है।

फिर हमने निजी क्षेत्र के रंग पर विभिन्न कार्यों को करने के लिए फ़ील्ड 1 का उपयोग किया।

फ़ील्ड के विभिन्न तरीकों के बारे में अधिक जानने के लिए, जावा फील्ड क्लास (आधिकारिक जावा प्रलेखन) पर जाएँ।

3. जावा कंस्ट्रक्टर का प्रतिबिंब

हम कक्षा द्वारा प्रदान किए गए विभिन्न तरीकों का उपयोग करके एक वर्ग के विभिन्न निर्माणकर्ताओं का भी निरीक्षण कर सकते हैं Constructor। उदाहरण के लिए,

 import java.lang.Class; import java.lang.reflect.*; class Dog ( // public constructor without parameter public Dog() ( ) // private constructor with a single parameter private Dog(int age) ( ) ) class Main ( public static void main(String() args) ( try ( // create an object of Dog Dog d1 = new Dog(); // create an object of Class // using getClass() Class obj = d1.getClass(); // get all constructors of Dog Constructor() constructors = obj.getDeclaredConstructors(); for (Constructor c : constructors) ( // get the name of constructors System.out.println("Constructor Name: " + c.getName()); // get the access modifier of constructors // convert it into string form int modifier = c.getModifiers(); String mod = Modifier.toString(modifier); System.out.println("Modifier: " + mod); // get the number of parameters in constructors System.out.println("Parameters: " + c.getParameterCount()); System.out.println(""); ) ) catch (Exception e) ( e.printStackTrace(); ) ) )

आउटपुट

 निर्माता का नाम: कुत्ता संशोधक: सार्वजनिक पैरामीटर: 0 निर्माता का नाम: कुत्ता संशोधक: निजी पैरामीटर: 1

उपरोक्त उदाहरण में, हमने एक वर्ग बनाया है जिसका नाम डॉग है। वर्ग में दो कंस्ट्रक्टर शामिल हैं।

हम कक्षा के निर्माणकर्ताओं के बारे में जानकारी खोजने के लिए प्रतिबिंब का उपयोग कर रहे हैं। कथन पर ध्यान दें,

 Constructor() constructors = obj.getDeclaredConstructor();

यहां, हम डॉग में मौजूद सभी कंस्ट्रक्टर्स को एक्सेस कर रहे हैं और उन्हें Constructorटाइप के अरै कंस्ट्रक्टर्स को असाइन कर रहे हैं ।

फिर हमने कंस्ट्रक्टर के बारे में अलग-अलग जानकारी प्राप्त करने के लिए ऑब्जेक्ट c का उपयोग किया।

  • c.getName () - कंस्ट्रक्टर का नाम देता है
  • c.getModifiers () - पूर्णांक के रूप में कंस्ट्रक्टर के एक्सेस मॉडिफायर लौटाता है
  • c.getParameterCount () - प्रत्येक कंस्ट्रक्टर में मौजूद मापदंडों की संख्या देता है

Constructorकक्षा के अधिक तरीकों के बारे में जानने के लिए , कन्स्ट्रक्टर कक्षा पर जाएँ

दिलचस्प लेख...