"हाय, अमीगो।"

"हैलो, ऋषि।"

"आज मैं आपको एक नया और बहुत ही दिलचस्प विषय समझाऊंगा: डायनेमिक प्रॉक्सी"

"जावा के पास किसी विशेष वर्ग की कार्यक्षमता को बदलने के कई तरीके हैं ..."

"पहला तरीका वंशानुक्रम है।"

"किसी वर्ग के व्यवहार को बदलने का सबसे आसान तरीका एक नया वर्ग बनाना है जो मूल (आधार) वर्ग को इनहेरिट करता है, और इसके तरीकों को ओवरराइड करता है। फिर, मूल वर्ग का उपयोग करने के बजाय, आप व्युत्पन्न वर्ग का उपयोग करते हैं। उदाहरण के लिए:"

Reader reader = new UserCustomReader();

"दूसरी विधि एक आवरण वर्ग का उपयोग करना है।"

" BufferedReader इस प्रकार के वर्ग का एक उदाहरण है। सबसे पहले, यह Reader को इनहेरिट करता है। दूसरे शब्दों में, इसका उपयोग Reader के बजाय किया जा सकता है। दूसरा, यह सभी कॉल को मूल Reader ऑब्जेक्ट पर रीडायरेक्ट करता है, जिसे BufferedReader ऑब्जेक्ट के कंस्ट्रक्टर को पास किया जाना चाहिए। । उदाहरण के लिए:"

Reader readerOriginal = new UserCustomReader();
Reader reader = new BufferedReader(readerOriginal);

"तीसरा तरीका डायनेमिक प्रॉक्सी (प्रॉक्सी) बनाना है।"

"जावा (java.lang.reflect.Proxy) में एक विशेष वर्ग है जो वास्तव में आपको इसके लिए एक अलग वर्ग बनाए बिना प्रोग्राम निष्पादन (गतिशील रूप से) के दौरान एक वस्तु बनाने देता है।"

"यह करने में बहुत आसान है:"

Reader reader = (Reader)Proxy.newProxyInstance();

"यह मेरे लिए पहले से ही कुछ नया है!"

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

" Invoke - एक विधि या वर्ग के लिए मानक नाम है जिसका प्राथमिक कार्य केवल किसी विधि को कॉल करना है।"

" हैंडलर - उस वर्ग का मानक नाम है जो किसी घटना को संभालता है। उदाहरण के लिए, एक वर्ग जो माउस क्लिक को संभालता है, उसे माउसक्लिकहैंडलर, आदि कहा जाएगा।"

"इनवोकेशनहैंडलर इंटरफ़ेस में एक एकल इनवोक विधि है, जिसके लिए प्रॉक्सी ऑब्जेक्ट के सभी कॉल निर्देशित किए जाते हैं। उदाहरण के लिए:"

कोड
Reader reader = (Reader)Proxy.newProxyInstance(new CustomInvocationHandler());
reader.close();
class CustomInvocationHandler implements InvocationHandler
{
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
 {
  System.out.println("yes!");
  return null;
 }
}

" रीडर . क्लोज़ () मेथड को कॉल करते समय , इनवोक मेथड को कॉल किया जाएगा, और स्क्रीन 'हां!' प्रदर्शित करेगी।"

"इसलिए, हमने एक कस्टम इनवोकेशनहैंडलर, क्लास घोषित किया, और इनवोकेशनहैंडलर इंटरफ़ेस और इसके इनवोकेशन मेथड को लागू किया। जब इनवोकेशन मेथड कहा जाता है, तो यह 'हां' प्रदर्शित करता है एक प्रॉक्सी वस्तु।"

"हाँ, यह सब सही है।"

"यह एक बहुत ही शक्तिशाली उपकरण है। आमतौर पर, ये प्रॉक्सी प्रोग्राम में वस्तुओं को अनुकरण करने के लिए बनाए जाते हैं जो भौतिक रूप से दूसरे कंप्यूटर पर चल रहे हैं।  या पहुंच को नियंत्रित करने के लिए।"

"आप इस पद्धति में वर्तमान उपयोगकर्ता की अनुमतियों की जांच कर सकते हैं, त्रुटियों को संभाल सकते हैं, त्रुटियों को लॉग कर सकते हैं और बहुत कुछ कर सकते हैं।"

"यहाँ एक उदाहरण है जहाँ इनवोक विधि मूल वस्तु के तरीकों को भी बुलाती है:"

कोड
Reader original = new UserCustomReader();

Reader reader = (Reader)Proxy.newProxyInstance(new CustomInvocationHandler(original));
reader.close();
class CustomInvocationHandler implements InvocationHandler
{
 private Reader readerOriginal;

 CustomInvocationHandler(Reader readerOriginal)
 {
  this.readerOriginal = readerOriginal;
 }

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
 {
  if (method.getName().equals("close"))
  {
   System.out.println("Reader closed!");
  }

  // This calls the readerOriginal object's close method.
  // The method's name and a description of its parameters are stored in the method variable.
  return method.invoke(readerOriginal, args);
 }
}

"इस उदाहरण में दो विशेष विशेषताएं हैं।"

"सबसे पहले, «मूल» रीडर ऑब्जेक्ट कंस्ट्रक्टर को दिया जाता है, और इसका एक संदर्भ CustomInvocationHandler के अंदर सहेजा जाता है ।

"दूसरा, हम इसी विधि को इनवोक विधि में फिर से कहते हैं, लेकिन इस बार «मूल» वस्तु पर।"

"आह। दूसरे शब्दों में, यह अंतिम पंक्ति उसी विधि को बुलाती है, लेकिन मूल वस्तु पर:"

return method.invoke(readerOriginal, args);

"हां।"

"मैं यह नहीं कहूंगा कि यह सुपर स्पष्ट है, लेकिन यह अभी भी समझ में आता है। या ऐसा लगता है।"

"बढ़िया। फिर एक और बात। newProxyInstance मेथड में, आपको प्रॉक्सी ऑब्जेक्ट बनाने के लिए थोड़ी और हाउसकीपिंग जानकारी पास करने की आवश्यकता होती है। लेकिन चूंकि हम राक्षसी प्रॉक्सी ऑब्जेक्ट नहीं बना रहे हैं, इसलिए यह जानकारी मूल क्लास से ही आसानी से प्राप्त हो जाती है। "

"यहाँ एक और उदाहरण है:"

कोड
Reader original = new UserCustomReader();

ClassLoader classLoader = original.getClass().getClassLoader();
Class<?>[] interfaces = original.getClass().getInterfaces();
CustomInvocationHandler invocationHandler = new CustomInvocationHandler(original);

Reader reader = (Reader)Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
class CustomInvocationHandler implements InvocationHandler
{
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
 {
  return null;
 }
}

"आह। क्लासलोडर और इंटरफेस की सूची। यह प्रतिबिंब से कुछ है, है ना?"

"हां।"

"मैं देख रहा हूँ। अच्छा, मुझे लगता है कि अगर मुझे कभी भी एक की आवश्यकता हो तो मैं एक आदिम, सुपर सरल प्रॉक्सी वस्तु बना सकता हूँ।"

"फिर डिएगो के साथ चेक इन करें।"