2013-01-24 25 views
5

तो मैं रनटाइम पर कक्षाओं के कन्स्ट्रक्टर का आह्वान करने की कोशिश कर रहा हूं। तर्कों की गलत संख्या:जावा प्रतिबिंब त्रुटि: तर्कों की गलत संख्या

String[] argArray = {...}; 
... 
Class<?> tempClass = Class.forName(...); 
Constructor c = tempClass.getConstructor(String[].class); 
c.newInstance(argArray); 
... 

जब भी मैं कोड संकलन और यह एक वर्ग के पास, मैं एक IllegalArgumentException मिलती है: मैं निम्नलिखित कोड का टुकड़ा है। जिस कक्षा में मैं कॉल कर रहा हूं उसका निर्माता एक स्ट्रिंग [] में एकमात्र तर्क के रूप में होता है। यह भी अजीब बात यह है कि अगर मैं एक पूर्णांक लेने के लिए कन्स्ट्रक्टर बदलता हूं और इंटीजर.TYPE का उपयोग करता हूं और c.newInstance (4) या कुछ कहता हूं, तो यह काम करता है। क्या कोई मुझे समझा सकता है कि मैं क्या गलत कर रहा हूं? धन्यवाद।

संपादित करें ;; पूरा त्रुटि:

java.lang.IllegalArgumentException: wrong number of arguments 
[Ljava.lang.String;@2be3d80c 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
+0

क्या आप पूरी त्रुटि पोस्ट कर सकते हैं? –

+0

जोड़ा गया स्टैक ट्रेस :) – de1337ed

उत्तर

7

मुझे यकीन है कि अगर यह सबसे अच्छा ठीक है नहीं कर रहा हूँ, लेकिन यह काम करना चाहिए:

c.newInstance((Object)argArray); 
+0

यह क्यों काम करता है! मुझे ऑब्जेक्ट पर डालने की ज़रूरत क्यों है? – de1337ed

+2

ऑब्जेक्ट के बिना [] wrapper newInstance एक एकल तर्क कन्स्ट्रक्टर को एकाधिक स्ट्रिंग तर्कों को पारित करने का प्रयास करता है। स्ट्रिंग सरणी के आकार के आधार पर अपवाद संदेश (java.lang.IllegalArgumentException: तर्क प्रकार मिलान) से बदलता है (java.lang.IllegalArgumentException: तर्कों की गलत संख्या)। – jdb

9

इसका कारण यह है newInstance(Object...)Object की varargs लेता हो रहा है, दूसरे शब्दों Object[] में। चूंकि सरणियों covariant कर रहे हैं, एक String[] भी एक Object[] है, और argArrayपहला तर्क के बजाय सभी तर्कों के रूप में किया जा रहा है interpretted

jdb's solution काम करता है क्योंकि यह संकलक को गलतफहमी से रोकता है। आप यह भी लिख सकते हैं:

c.newInstance(new Object[] {argArray}); 
संबंधित मुद्दे