सामान्य रूप में प्रतिबिंब के चढ़ाव
परावर्तन को स्ट्रेट-लाइन कोड की तुलना में समझना कठिन है।
मेरे अनुभव में, प्रतिबिंब जावा में एक "विशेषज्ञ-स्तरीय" विशेषता है। मेरा तर्क है कि अधिकांश प्रोग्रामर कभी भी प्रतिबिंब का सक्रिय रूप से उपयोग नहीं करते हैं (अर्थात परावर्तन का उपयोग करने वाले पुस्तकालयों की गिनती नहीं होती है)। यह इन प्रोग्रामरों के लिए समझने के लिए कठिन कोड का उपयोग करता है।
परावर्तन कोड स्थिर विश्लेषण के लिए दुर्गम है
मान लीजिए कि getFoo
मेरी कक्षा में एक गटर है और मैं इसका नाम बदलना चाहता हूं getBar
। अगर मैं बिना किसी प्रतिबिंब का उपयोग करता हूं, तो मैं कोड बेस को केवल खोज सकता हूं getFoo
और हर स्थान को ढूंढूंगा जो कि गेट्टर का उपयोग करता है इसलिए मैं इसे अपडेट कर सकता हूं, और यहां तक कि अगर मुझे एक भी याद आती है, तो कंपाइलर शिकायत करेगा।
लेकिन अगर वह जगह जो गटर का उपयोग करती है, कुछ है callGetter("Foo")
और callGetter
करती है getClass().getMethod("get"+name).invoke(this)
, तो उपरोक्त विधि इसे नहीं ढूंढेगी, और कंपाइलर शिकायत नहीं करेगा। केवल जब कोड वास्तव में क्रियान्वित किया जाता है यदि आप एक मिल जाएगा NoSuchMethodException
। और उस दर्द की कल्पना करें, यदि आप उस अपवाद (जिसे ट्रैक किया गया है) को निगल जाते हैं callGetter
क्योंकि "इसका उपयोग केवल हार्ड-कोडेड स्ट्रिंग्स के साथ किया जाता है, यह वास्तव में नहीं हो सकता है"। (कोई भी ऐसा नहीं करेगा, कोई बहस कर सकता है; सिवाय इसके कि ओपी ने अपने एसओ उत्तर में ठीक यही किया। यदि क्षेत्र का नाम बदल दिया जाता है, तो जेनेरिक सेटर के उपयोगकर्ता कभी भी नोटिस नहीं करेंगे, सिवाय सेटर के बेहद अस्पष्ट बग के अलावा चुपचाप कुछ भी नहीं। यदि वे भाग्यशाली हैं, तो पाने वाले के उपयोगकर्ता, अनदेखे अपवाद के कंसोल आउटपुट को नोटिस कर सकते हैं।]
रिफ्लेक्शन कोड कंपाइलर द्वारा टाइप-चेक नहीं किया जाता है
यह मूल रूप से उपरोक्त का एक बड़ा उप-बिंदु है। प्रतिबिंब कोड सभी के बारे में है Object
। रनटाइम पर प्रकारों की जाँच की जाती है। त्रुटियों की खोज यूनिट परीक्षणों द्वारा की जाती है, लेकिन केवल तभी जब आपके पास कवरेज हो। ("यह सिर्फ एक गटर है, मुझे इसकी जांच करने की आवश्यकता नहीं है।") मूल रूप से, पायथन पर जावा का उपयोग करके आप लाभ खो देते हैं, आपको पहले स्थान पर प्राप्त हुआ।
अनुकूलन के लिए परावर्तन कोड अनुपलब्ध है
हो सकता है कि सिद्धांत रूप में नहीं, लेकिन व्यवहार में, आपको एक JVM नहीं मिलेगा जो इनलाइन या इनलाइन कैश बनाता है Method.invoke
। इस तरह के अनुकूलन के लिए सामान्य विधि कॉल उपलब्ध हैं। जो उन्हें बहुत तेज बनाता है।
प्रतिबिंब कोड सामान्य रूप से धीमा है
रिफ्लेक्शन कोड के लिए आवश्यक डायनेमिक मेथड लुकअप और टाइप चेकिंग सामान्य विधि कॉल की तुलना में धीमी है। यदि आप उस सस्ते वन-लाइन गेट्टर को रिफ्लेक्टेंट जानवर में बदल देते हैं, तो हो सकता है कि आपने मंदी के परिमाण के कई आदेशों को देखा हो।
सामान्य रूप से सामान्य गेट्टर / सेटर के नीचे
यह सिर्फ एक बुरा विचार है, क्योंकि आपकी कक्षा में अब कोई एनकैप्सुलेशन नहीं है। इसका हर क्षेत्र सुलभ है। आप उन सभी को सार्वजनिक कर सकते हैं।