所以我试图在运行时调用类构造函数。我有以下代码片段:
String[] argArray = {...};
...
Class<?> tempClass = Class.forName(...);
Constructor c = tempClass.getConstructor(String[].class);
c.newInstance(argArray);
...
每当我编译代码并向其传递一个类时,我都会收到 IllegalArgumentException:参数数量错误。我调用的类的构造函数将 String[] 作为唯一的参数。同样奇怪的是,如果我更改构造函数以接受整数并使用 Integer.TYPE 并调用 c.newInstance(4) 或其他内容,它就会起作用。有人可以向我解释我做错了什么吗?谢谢。
编辑;;完整错误:
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)
最佳答案
发生这种情况是因为 newInstance(Object...)
需要varargs Object
,换句话说,Object[]
。由于数组是协变的,String[]
也是一个 Object[]
,并且 argArray
被解释为所有参数 而不是第一个参数。
jdb's solution之所以有效,是因为它可以防止编译器误解。你也可以这样写:
c.newInstance(new Object[] {argArray});
关于Java反射错误: Wrong number of arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14491699/