2011-02-28 19 views
5

considere el siguiente código,IllegalArgumentException: número incorrecto de argumentos en Java Constructor.newInstance()

public class StartUp { 

    public StartUp(String[] test){} 

    public static void main(String[] args) throws Exception{ 
     Constructor cd = StartUp.class.getConstructor(String[].class); 
     System.out.println(cd.newInstance(new String[]{}).toString()); 
    } 
} 

¿Qué pasa con ella? Me da la siguiente excepción:

Excepción en hilo java.lang.IllegalArgumentException "principal": número incorrecto de argumentos en sun.reflect.NativeConstructorAccessorImpl.newInstance0 (Nativo Método) en sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:39) en sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:27) en java.lang.reflect.Constructor.newInstance (Constructor.java:513) en com.test.StartUp.main (StartUp.java:10)

Respuesta

21

Su String[] se convierte implícitamente en Object[] y se toma como una matriz vacía de argumentos, en lugar de como un único argumento que es una matriz vacía. Prueba esto:

Object arg = new String[0]; 
System.out.println(cd.newInstance(arg).toString()); 

o

System.out.println(cd.newInstance(((Object)new String[0]).toString()); 

o incluso evitar el compilador tener que crear la matriz para usted en todo:

System.out.println(cd.newInstance(new Object[] { new String[0] }).toString()); 

Básicamente se trata de una mezcla de manipulación varargs y gama covarianza: (

-1

Puede usar dp4j opción detallada para responder a su questi y obtenga el código de reflejo correcto que necesita:

$ vim ReflectedAcces.java 
class StartUp { 

    private StartUp(String[] test){} 

} 

public class ReflectedAcces{ 

     @com.dp4j.InjectReflection 
    public static void main(String[] args) throws Exception{ 
       StartUp su = new StartUp(new String[]{}); 
       System.out.println(su.toString()); 
    } 

} 


$ javac -cp dp4j-1.0-jar-with-dependencies.jar -Averbose=true ReflectedAcces.java 
... 
ReflectedAcces.java:10: Note: 
class StartUp { 

    private StartUp(String[] test) { 
    } 
} 
public class ReflectedAcces { 

    public ReflectedAcces() { 
     super(); 
    } 

    @com.dp4j.InjectReflection() 
    public static void main(String[] args) java.lang.ClassNotFoundException, java.lang.NoSuchFieldException, java.lang.IllegalAccessException, java.lang.NoSuchMethodException, java.lang.reflect.InvocationTargetException, java.lang.InstantiationException { 
     final java.lang.reflect.Constructor startUpConstructor = Class.forName("StartUp").getDeclaredConstructor(.java.lang.String[].class); 
     startUpConstructor.setAccessible(true); 
     StartUp su = (.StartUp)startUpConstructor.newInstance(new .java.lang.Object[1][]{new String[]{}}); 
     System.out.println(su.toString()); 
    } 
} 
Cuestiones relacionadas