यह धोखा नहीं है, लेकिन किसी भी उपकरण की तरह, इसका उपयोग उस चीज़ के लिए किया जाना चाहिए जिसे इसे हल करने का इरादा है। परावर्तन, परिभाषा से, आपको कोड के माध्यम से कोड का निरीक्षण करने और संशोधित करने की अनुमति देता है; यदि आपको ऐसा करने की आवश्यकता है, तो प्रतिबिंब काम के लिए उपकरण है। प्रतिबिंब सभी मेटा-कोड के बारे में है: कोड जो लक्ष्य को लक्षित करता है (नियमित कोड के विपरीत, जो डेटा को लक्षित करता है)।
अच्छा प्रतिबिंब उपयोग का एक उदाहरण सामान्य वेब सेवा इंटरफ़ेस कक्षाएं हैं: पेलोड कार्यक्षमता से प्रोटोकॉल कार्यान्वयन को अलग करने के लिए एक विशिष्ट डिज़ाइन है। तो फिर आपके पास एक वर्ग है (चलो इसे कॉल करें T
) जो आपके पेलोड को लागू करता है, और दूसरा जो प्रोटोकॉल को लागू करता है ( P
)। T
काफी सीधा है: आप जो भी कॉल करना चाहते हैं, उसके लिए बस एक तरीका लिखें, जो भी करना चाहिए। P
हालाँकि, कॉल करने के लिए वेब सेवा कॉल को मैप करने की आवश्यकता है। इस मानचित्रण को सामान्य बनाना वांछनीय है, क्योंकि यह अतिरेक से बचा जाता है, और P
अत्यधिक पुन: प्रयोज्य बनाता है। परावर्तन T
, रनटाइम पर कक्षा का निरीक्षण करने और P
वेब सेवा प्रोटोकॉल के माध्यम से पारित स्ट्रिंग्स के आधार पर अपने तरीकों को कॉल करने का साधन प्रदान करता है, बिना किसी कक्षा के संकलन-समय के ज्ञान केT
। 'कोड के बारे में कोड' नियम का उपयोग करते हुए, कोई यह तर्क दे सकता है कि कक्षा P
में T
अपने डेटा के भाग के रूप में कोड है ।
हालाँकि।
चिंतन आपको भाषा के प्रकार प्रणाली के प्रतिबंधों के आसपास आने के लिए उपकरण भी देता है - सैद्धांतिक रूप से, आप सभी मापदंडों को टाइप के रूप में पारित कर सकते हैं object
, और प्रतिबिंब के माध्यम से उनके तरीकों को कॉल कर सकते हैं। Voilà, जिस भाषा को मजबूत स्थिर टाइपिंग अनुशासन को लागू करने के लिए माना जाता है, वह अब देर से बाध्यकारी के साथ गतिशील रूप से टाइप की गई भाषा की तरह व्यवहार करती है, केवल यह कि वाक्यविन्यास कहीं अधिक विस्तृत है। इस तरह के पैटर्न के हर एक उदाहरण को मैंने अब तक एक गंदे हैक के रूप में देखा है, और हमेशा के लिए, भाषा के प्रकार की प्रणाली के भीतर एक समाधान संभव हो गया होता, और यह सभी मामलों में अधिक सुरक्षित, अधिक सुरुचिपूर्ण और अधिक कुशल होता। ।
कुछ अपवाद मौजूद हैं, जैसे जीयूआई नियंत्रण जो विभिन्न गैर-संबंधित प्रकार के डेटा स्रोतों के लिए डेटा-बाउंड हो सकते हैं; यह कहते हुए कि आपका डेटा एक निश्चित इंटरफ़ेस लागू करता है, ताकि आप डेटा-बाइंड कर सकें कि यह यथार्थवादी नहीं है, और न ही प्रोग्रामर प्रत्येक प्रकार के डेटा स्रोत के लिए एक एडेप्टर लागू कर रहा है। इस मामले में, डेटा स्रोत के प्रकार का पता लगाने और डेटा बाइंडिंग को समायोजित करने के लिए प्रतिबिंब का उपयोग करना अधिक उपयोगी विकल्प है।