2012-11-22 23 views
7

मान लें कि मेरे पास कक्षाएं A और B हैं, जहां BA फैली हुई है। मेरे पास B में एक तर्क है जो एक तर्क के साथ A है। मेरे पास B का एक ऑब्जेक्ट भी है जिसे bObj कहा जाता है।जावा प्रतिबिंब getConstructor विधि

B.class.getConstructor(new Class[] { bObj.getClass() }) पर कॉल करने का कोई तरीका है और BA से बढ़ने के बाद से निर्माता प्राप्त करें? फिलहाल मुझे NoSuchMethodException मिल रहा है।

सादर, स्टेन

+2

'B.class.getConstructors का उपयोग कर के बारे में क्या()' , उन लोगों को ढूंढें जो वास्तव में एक तर्क लेते हैं, और जांचें कि 'एक्लास' 'क्या यह अस्वीकार्य है? –

+0

बी का कन्स्ट्रक्टर सार्वजनिक है? –

+0

arne.b यह करने का एक तरीका है लेकिन मैंने सोचा कि यह वास्तव में आसान हो सकता है। नंदकुमार हां, यह सार्वजनिक है। –

उत्तर

6

मैं सुझाव है कि आप Apache Commons Lang से ConstructorUtils पर एक नजर है क्या सोचते है।
उनके पास कन्स्ट्रक्टर डिस्कवरी विधियों के सभी शिष्टाचार हैं।

आपका केस "Matching Accessible Constructors" द्वारा कवर किया जाना चाहिए।

Here संदर्भ में उपयोग की गई विधि का एक उदाहरण है। मूल रूप से, आप इसे इस तरह कहते हैं:

private <T> T instantiate(Class<?> input, Object parameter) { 
    try { 
    Constructor<?> constructor = ConstructorUtils.getMatchingAccessibleConstructor(input, parameter.getClass()); 
    return (T) constructor.newInstance(parameter); 
    } catch (Exception e) { 
    //handle various exceptions 
    } 
} 
+3

यह बेकार ढंग से काम करता है और है - मेरी राय में - काफी सुरुचिपूर्ण। दो अतिरिक्त संकेत: (1) यदि आप "इनपुट" पैरामीटर को 'कक्षा इनपुट' के रूप में घोषित करते हैं, तो आप वापसी मूल्य को कास्ट करने से रोक सकते हैं। (2) 'कंस्ट्रक्टर यूटिलस.inवोक कन्स्ट्रक्टर (कक्षा सीएलएस, ऑब्जेक्ट ... तर्क) 'कन्स्ट्रक्टर प्राप्त करने और एक नया उदाहरण बनाने के लिए जोड़ती है। –

3

नहीं है, तरीकों जो खोज के लिए आप सटीक मानकों की उम्मीद है। तो जब आप प्रतिबिंब एपीआई के खोजने/खोज विधियों का उपयोग करके एक कन्स्ट्रक्टर, विधि या फ़ील्ड की तलाश करते हैं, तो एपीआई मिलान खोजने के लिए equals() का उपयोग करता है।

यदि आपको उसी तर्क की आवश्यकता है जो जावा कंपाइलर उपयोग करेगा, तो आपको FEST Reflect या commons beanutils जैसे ढांचे का उपयोग करने की आवश्यकता होगी। या आपको getConstructors() पर कॉल करना होगा और अपना खुद का फ़िल्टर कोड लिखना होगा।

पहली नज़र में, यह बेवकूफ लगता है: यदि जावा कंपाइलर ऐसा कर सकता है, तो प्रतिबिंब API क्यों नहीं हो सकता? दो कारण हैं: सबसे पहले, जावा रनटाइम को यह जानने की आवश्यकता नहीं है कि किस विधि को कॉल करना है क्योंकि संकलक ने पहले से ही सही विधि का चयन किया है।

दूसरा कारण यह है कि प्रतिबिंब एपीआई हमेशा "दूसरा सर्वश्रेष्ठ" था। लेकिन लक्ष्य कभी नहीं था यह वास्तव में आसान/अनुकूल उपयोग करने के लिए बनाने के लिए यह सब कुछ कर सकते हैं (कम से कम, कि मैं हर बार जब मैं इसका इस्तेमाल :-)

0

यदि आपका निर्माता सार्वजनिक (या अगर यह वर्ग सार्वजनिक नहीं है) अपने कोड दायरे से सुलभ नहीं है, या नहीं, यह

Class.getConstructor() 
के माध्यम से लौटाया नहीं जाएगा

Class.getDeclaredConstructor() 

कोशिश के बजाय

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