IllegalArgumentException:Java Constructor.newInstance()中的参数数量错误

xan*_*ndy 6 java reflection constructor illegalargumentexception

考虑以下代码,

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

它出什么问题了?我得到以下例外:

线程"main"中的异常java.lang.IllegalArgumentException:sun.reflect.DelegatingConstructorAccessorImpl上sun​​.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)的sun.reflect.NativeConstructorAccessorImpl.newInstance0(本地方法)中的参数数量错误. newInstance(DelegatingConstructorAccessorImpl.java:27)位于com.test.StartUp.main的java.lang.reflect.Constructor.newInstance(Constructor.java:513)中(StartUp.java:10)

Jon*_*eet 23

String[]被隐式转换Object[]为一个空数组的参数,而不是作为一个空数组的单个参数.试试这个:

Object arg = new String[0];
System.out.println(cd.newInstance(arg).toString());
Run Code Online (Sandbox Code Playgroud)

要么

System.out.println(cd.newInstance(((Object)new String[0]).toString());
Run Code Online (Sandbox Code Playgroud)

甚至避免编译器必须为你创建数组:

System.out.println(cd.newInstance(new Object[] { new String[0] }).toString());
Run Code Online (Sandbox Code Playgroud)

基本上这是varargs处理和数组协方差的混合:(