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处理和数组协方差的混合:(