6

所以我试图在运行时调用一个类构造函数。我有以下代码片段:

String[] argArray = {...};
...
Class<?> tempClass = Class.forName(...);
Constructor c = tempClass.getConstructor(String[].class); 
c.newInstance(argArray);
...

每当我编译代码并将其传递给一个类时,我都会收到 IllegalArgumentException: wrong number of arguments。我正在调用的类的构造函数将 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)
4

2 回答 2

11

发生这种情况是因为newInstance(Object...)需要varargsObject换句话说Object[]。由于数组是协变的,所以 aString[]也是一个Object[], 并且argArray被解释为所有参数而不是第一个参数

jdb 的解决方案之所以有效,是因为它可以防止编译器产生误解。你也可以写:

c.newInstance(new Object[] {argArray});
于 2013-01-24T00:25:25.583 回答
10

我不确定这是否是最好的解决方法,但这应该可以:

c.newInstance((Object)argArray);
于 2013-01-24T00:19:07.757 回答