"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > रनटाइम ऑब्जेक्ट एक्सेस और मैनिपुलेशन के लिए जावा में मेथड और वेरिएबल हैंडल का उपयोग करना

रनटाइम ऑब्जेक्ट एक्सेस और मैनिपुलेशन के लिए जावा में मेथड और वेरिएबल हैंडल का उपयोग करना

2024-11-02 को प्रकाशित
ब्राउज़ करें:652

Using Method and Variable Handles in Java for Runtime Object Access and Manipulation

प्रतिबिंब और विधि/var हैंडल जावा में दो शक्तिशाली विशेषताएं हैं जो डेवलपर्स को रनटाइम पर ऑब्जेक्ट तक पहुंचने और हेरफेर करने की अनुमति देती हैं। हालाँकि, वे वस्तुओं तक पहुँचने और उन्हें संभालने के तरीके में भिन्न हैं।

आइए एक उदाहरण पर नजर डालें कि कक्षा में किसी विधि तक पहुंचने के लिए प्रतिबिंब का उपयोग कैसे करें। हम "माईक्लास" नामक एक साधारण वर्ग से शुरुआत करेंगे जिसमें एक निजी स्ट्रिंग वेरिएबल और उस वेरिएबल के लिए एक गेटर विधि है। इस ऑब्जेक्ट को बनाने के लिए, हम सामान्य इंस्टेंशियेशन का उपयोग कर सकते हैं:

MyClass objectInstance = new MyClass("John Doe");

प्रतिबिंब का उपयोग करके विधि तक पहुंचने के लिए, हमें पहले getClass() विधि का उपयोग करके अपने ऑब्जेक्ट इंस्टेंस का वर्ग प्राप्त करना होगा। फिर, जिस विधि तक हम पहुंचना चाहते हैं उसे ढूंढने के लिए हम getDeclaredMethod() विधि का उपयोग कर सकते हैं, इस मामले में, "getName"। अंत में, हमें इनवोक() विधि का उपयोग करके विधि को लागू करना होगा और अपने ऑब्जेक्ट इंस्टेंस में पास करना होगा। इस प्रक्रिया के लिए कोड यहां दिया गया है:

Class> clazz = objectInstance.getClass();
Method method = clazz.getDeclaredMethod("getName");
String value = (String) method.invoke(objectInstance);
System.out.println(value); // prints "John Doe"

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

किसी विधि तक पहुंचने के लिए विधि हैंडल का उपयोग प्रतिबिंब का उपयोग करने के समान है। हम अपने ऑब्जेक्ट इंस्टेंस की क्लास प्राप्त करके शुरुआत करते हैं। फिर, जिस विधि तक हम पहुंचना चाहते हैं उसे देखने के लिए हम मेथडहैंडल पर findVirtual() विधि का उपयोग करते हैं। इसके बाद, हम इनवोक() विधि का उपयोग करके विधि को कॉल करते हैं और अपने ऑब्जेक्ट इंस्टेंस में पास करते हैं। इस प्रक्रिया के लिए कोड यहां दिया गया है:

Class> clazz = objectInstance.getClass();
MethodHandle handle = MethodHandles.lookup().findVirtual(clazz, "getName", methodType(String.class));
String value = (String) handle.invoke(objectInstance);
System.out.println(value);  // Prints “John Doe”

हालाँकि, विधि हैंडल क्या कर सकते हैं इसकी सीमाएँ हैं। वे त्वरित कक्षाओं जैसे कार्यों को संभाल नहीं सकते हैं, जो प्रतिबिंब के साथ संभव है।

विधि हैंडल की शक्ति को प्रदर्शित करने के लिए, आइए देखें कि किसी कक्षा में किसी निजी क्षेत्र तक सीधे पहुंचने के लिए उनका उपयोग कैसे किया जा सकता है। मान लें कि हमारी "MyClass" क्लास में एक निजी स्ट्रिंग वेरिएबल है जिसे "नाम" कहा जाता है। हम इस तक पहुंचने के लिए प्रतिबिंब का उपयोग कर सकते हैं, लेकिन विधि हैंडल का उपयोग करना एक सुरक्षित विकल्प है।

प्रतिबिंब का उपयोग करके किसी निजी क्षेत्र तक सीधे पहुंचने के लिए, हमें पहले अपने ऑब्जेक्ट इंस्टेंस का वर्ग प्राप्त करना होगा। फिर, हम उस फ़ील्ड को ढूंढने के लिए getDeclaredField() विधि का उपयोग करते हैं जिसे हम एक्सेस करना चाहते हैं, इस मामले में, "नाम"। हालाँकि, चूंकि यह फ़ील्ड निजी है, हमें इसकी पहुंच को सही पर सेट करने के लिए setAccessible() विधि का उपयोग करने की आवश्यकता है। अंत में, हम फ़ील्ड का मान प्राप्त करने के लिए get() विधि का उपयोग कर सकते हैं। इस प्रक्रिया के लिए कोड यहां दिया गया है:

Class> clazz = objectInstance.getClass(); 
Field field = clazz.getDeclaredField("name"); 
field.setAccessible(true); 
String value = (String) field.get(objectInstance);
System.out.println(value); // prints “John Doe”

मेथड हैंडल का उपयोग करते हुए, प्रक्रिया समान है। हम अपने ऑब्जेक्ट इंस्टेंस की क्लास प्राप्त करके शुरू करते हैं, और फिर हम फ़ील्ड के एक्सेस संशोधक का सम्मान करने के लिए मेथडहैंडल्स पर प्राइवेटलुकअपइन() विधि का उपयोग करते हैं (क्योंकि यह निजी है)। इसके बाद, जिस फ़ील्ड तक हम पहुंचना चाहते हैं उसे ढूंढने के लिए हम findVarHandle() विधि का उपयोग करते हैं। अंत में, हम इसका मान प्राप्त करने के लिए get() विधि का उपयोग कर सकते हैं। इस प्रक्रिया के लिए कोड यहां दिया गया है:

Class> clazz = objectInstance.getClass(); 
VarHandle handle = MethodHandles.privateLookupIn(clazz, MethodHandles.lookup()).findVarHandle(clazz, "name", String.class);
String value = (String) handle.get(objectInstance);
System.out.println(value); // prints “John Doe”

प्रदर्शन कारणों से हैंडल को स्थिर रूप से इंस्टेंटियेट करने की अनुशंसा की जाती है, लेकिन इसके लिए क्लास का नाम जानना आवश्यक है। यदि आप वर्ग का नाम नहीं जानते हैं, तो इस दृष्टिकोण का उपयोग करना संभव नहीं है।

विधि हैंडल की एक सीमा यह है कि वे चेक किए गए अपवादों को संभालने का कोई तरीका प्रदान नहीं करते हैं। मेथड हैंडल और var हैंडल पर विभिन्न ऑपरेशन चेक किए गए अपवादों को फेंकते हैं जिन्हें उत्पादन कोड में पकड़ा और घोषित किया जाना चाहिए।

निष्कर्ष में, विधि और परिवर्तनीय हैंडल क्लास मेटाडेटा खोजने और सामान्य जावा प्रतिबंधों के बाहर विधियों और क्षेत्रों तक पहुंचने के लिए जेडीके में क्षमताओं की एक केंद्रित श्रृंखला प्रदान करते हैं। हालाँकि वे प्रतिबिंब की सभी क्षमताओं को कवर नहीं करते हैं, फिर भी वे इन कार्यों के लिए सुरक्षित और अधिक अनुकूलित विकल्प प्रदान करते हैं।

MyExamCloud की अध्ययन योजनाओं के साथ जावा प्रमाणन के लिए अध्ययन करने का सबसे अच्छा तरीका अनुभव करें और मानार्थ अभ्यास परीक्षणों का आनंद लें।

विज्ञप्ति वक्तव्य इस लेख को इस पर पुनर्मुद्रित किया गया है: https://dev.to/myexamcloud/using-method-and-variable-handles-in-java-for-runtime-ubject-access-and-mansipulation-22gn?1 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए [email protected] पर संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3