2011-11-23 12 views
40

मुझे लगता है कि जावा प्रतिबिंब एपीआई में वहाँ कंस्ट्रक्टर्स लागू करने के लिए दो अलग अलग तरीके हैं नोटिस। हालांकि जावा दस्तावेज़ थोड़ा अलग हैं (getDeclaredConstructors का अर्थ यह है कि यह सार्वजनिक निर्माताओं की बजाय सभी रचनाकारों को देता है), यह स्पष्ट नहीं है कि एपीआई इन दो अलग-अलग तरीकों का स्पष्ट रूप से समर्थन क्यों करती है।क्लास एपीआई में GetDeclaredConstructors और getConstructors के बीच क्या अंतर है? <code>getDeclaredConstructors</code>/<code>getConstructors</code> विधि:

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

उत्तर

46

getDeclaredConstructors

निर्माता वस्तुओं सभी कंस्ट्रक्टर्स वर्ग इस वर्ग वस्तु का प्रतिनिधित्व करती द्वारा घोषित दर्शाती की एक सरणी देता है (आप सभी कंस्ट्रक्टर्स चाहते हैं जब)। ये सार्वजनिक, संरक्षित, डिफ़ॉल्ट (पैकेज) पहुंच, और निजी निर्माता हैं।

getConstructors (जब आप चाहते केवल public कंस्ट्रक्टर्स)

निर्माता वस्तुओं वर्ग इस वर्ग वस्तु का प्रतिनिधित्व करती के सभी सार्वजनिक कंस्ट्रक्टर्स दर्शाती युक्त एक सरणी देता है।

तो, उन दोनों के लिए डॉक्स पर देख रहे हैं, मुझे लगता है कि एक अंतर यह है कि getConstructors रिटर्न केवल public कंस्ट्रक्टर्स जबकि getDeclaredConstructors रिटर्न सभी निर्माताओं (public, protected, डिफ़ॉल्ट (पैकेज) का उपयोग, और private)

तो, यह आसान है अगर आपको केवल public कन्स्ट्रक्टर की आवश्यकता है तो getConstructors का उपयोग करें। अन्यथा, यदि आपको सभी रचनाकारों (कन्स्ट्रक्टर के एक्सेस-संशोधक को अनदेखा करना) की आवश्यकता है तो getDeclaredConstructors का उपयोग करें।

+7

और creator.setAccessible (true) का उपयोग करके, आप व्यक्तिगत रूप से रचनाकारों को प्रतिबिंबित कर सकते हैं। – MeBigFatGuy

+0

हालांकि यह उत्तर सही है, वहां थोड़ी सी चेतावनी है। संकलक स्वचालित रूप से किसी भी वर्ग के लिए एक डिफ़ॉल्ट (नो-तर्क) सार्वजनिक कन्स्ट्रक्टर प्रदान करता है जो स्पष्ट रूप से किसी भी निर्माता को परिभाषित नहीं करता है। 'getConstructors' इस डिफ़ॉल्ट कन्स्ट्रक्टर को वापस नहीं करेगा, लेकिन 'getDeclaredConstructors' करता है। – neXus

3

विधि 'getDeclaredConstructors' केवल क्लास के अंदर घोषित किए गए रचनाकारों को लौटाता है। विधि 'getConstructors' उन रचनाकारों को भी लौटाती है जिन्हें कक्षा के अंदर घोषित नहीं किया जाता है लेकिन उन्हें सुपर क्लास से विरासत में मिलाया जाता है।

तो यह निर्भर करता है कि आप क्या करने जा रहे हैं। कोई सही दृष्टिकोण नहीं है, यह वास्तव में निर्भर करता है कि आपको सुपर कन्स्ट्रक्टर की भी आवश्यकता है।

+3

यह गलत है। प्राप्त * रचनाकार() विधियां _not_ प्राप्त * विधि() विधियों के समान व्यवहार करती हैं। वे दोनों सुपरक्लास के रचनाकारों को अनदेखा करते हुए केवल दिए गए वर्ग के रचनाकार लाते हैं। (उनका अंतर उनके द्वारा प्राप्त किए गए रचनाकारों की दृश्यता में है।) यह इस तथ्य के अनुसार है कि जब आप कक्षा को तत्काल बनाते हैं तो आपको अपने रचनाकारों में से एक का उपयोग करना चाहिए, आप उन्हें बाईपास नहीं कर सकते हैं और सीधे अपने सुपरक्लास के रचनाकारों में से किसी एक को आमंत्रित नहीं कर सकते हैं। आप इसका परीक्षण करने के लिए कुछ परीक्षण कक्षाएं लिख सकते हैं। (मैंने किया।) कृपया इस भ्रामक उत्तर को हटा दें। –

+3

जावा में रचनाकारों को विरासत में नहीं मिला है। –

3

getDeclaredXX() तरीकों तरीकों से कक्षाओं के हेरफेर जरूरी है कि उन वर्गों के निर्माता द्वारा इरादा नहीं थे के लिए मौजूद हैं। ध्यान दें कि getDeclaredMethod() विधि है जो आपको निजी विधियों, और getDeclaredField() विधि का आह्वान करने की अनुमति देती है जो आपको निजी फ़ील्ड प्राप्त करने/सेट करने की अनुमति देती है।

मैं "वैध" उपयोग के मामलों के बारे में पूरी तरह से यकीन नहीं है, लेकिन इन स्पष्ट रूप से कुछ बातें करने के लिए उपयोगी होते हैं। साथ ही, विधियों का यह परिवार केवल विशेष रूप से वर्ग में घोषित चीजें देता है, न कि सुपरक्लास की वजह से वर्ग में मौजूद चीजें।

एक निजी निर्माता को एक्सेस करना एक ही कारण के लिए उपयोगी हो सकता है, मुझे लगता है।

0

मैं कक्षाओं का एक कारखाना बनाने के लिए getDeclaredConstructors का उपयोग करता हूं जिसका कन्स्ट्रक्टर निजी है कि यह सुनिश्चित करने के लिए कि मेरे सिस्टम के "उपयोगकर्ता" कारखाने का उपयोग किए बिना इन वर्गों को सीधे बना सकते हैं। मुझे यह विधि काफी उपयोगी लगता है।

संबंधित मुद्दे