2013-01-24 11 views
5

Quindi sto provando a richiamare un costruttore di classi in fase di esecuzione. Ho il seguente frammento di codice:Errore Java Reflections: numero errato di argomenti

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

Ogni volta che compilare il codice e passare una classe, ottengo un IllegalArgumentException: sbagliato numero di argomenti. Il costruttore della classe che sto chiamando accetta String [] come unico argomento. La cosa strana è che se cambio il costruttore per prendere un intero e usare Integer.TYPE e chiamare c.newInstance (4) o qualcosa, funziona. Qualcuno può spiegarmi cosa sto facendo male? Grazie.

Modifica ;; errore completo:

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

Potresti postare l'errore completo? –

+0

Aggiunto traccia dello stack :) – de1337ed

risposta

7

non sono sicuro se è la migliore soluzione, ma questo dovrebbe funzionare:

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

Perché funziona? Perché devo eseguire il cast sull'oggetto? – de1337ed

+2

Senza il wrapper Object [] newInstance prova a passare più argomenti String a un singolo costruttore di argomenti. Il messaggio di eccezione cambia da (java.lang.IllegalArgumentException: argomento tipo non corrispondente) a (java.lang.IllegalArgumentException: numero errato di argomenti) in base alla dimensione dell'array String. – jdb

9

Questo sta accadendo perché newInstance(Object...) prende varargs di Object, in altre parole Object[]. Poiché gli array sono covarianti, un String[] è interpretato come tutti gli argomenti anziché primo argomento.

jdb's solution funziona perché impedisce al compilatore di fraintendere. Potresti anche scrivere:

c.newInstance(new Object[] {argArray}); 
Problemi correlati