2011-02-28 51 views
5

考慮下面的代碼參數,拋出:IllegalArgumentException:錯號碼的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()); 
    } 
} 

這有什麼錯呢?我得到以下異常:線程「主」 java.lang.IllegalArgumentException異常

異常:錯誤的參數數目 在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本機方法) 在sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:39) 在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 在java.lang.reflect.Constructor.newInstance(Constructor.java:513) 在com.test.StartUp.main (StartUp.java:10)

回答

21

您的String[]正被隱式轉換爲Object[],並被視爲參數的空數組,而不是作爲空數組的單個參數。嘗試:

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

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

或甚至避免不必爲創建所述陣列在所有的編譯器:

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

基本上,這是可變參數處理和陣列的混合物協方差:(

-1

您可以使用dp4j詳細選項來回答您的questi並獲得您需要的正確反射碼:

$ 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()); 
    } 
} 
相關問題