Java Reflections错误:参数数量错误

de1*_*7ed 6 java reflection constructor

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

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

每当我编译代码并将其传递给一个类时,我会得到一个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)
Run Code Online (Sandbox Code Playgroud)

Pau*_*ora 11

这是发生,因为newInstance(Object...)采用的可变参数Object,换句话说Object[].由于数组是协变的,a String[]也是一个Object[],并且argArray被解释为所有参数而不是第一个参数.

jdb的解决方案有效,因为它可以防止编译器误解.你也可以这样写:

c.newInstance(new Object[] {argArray});
Run Code Online (Sandbox Code Playgroud)


jdb*_*jdb 9

我不确定它是否是最好的修复,但这应该工作:

c.newInstance((Object)argArray);
Run Code Online (Sandbox Code Playgroud)

  • 如果没有Object []包装器,newInstance会尝试将多个String参数传递给单个参数构造函数.异常消息从(java.lang.IllegalArgumentException:参数类型不匹配)更改为(java.lang.IllegalArgumentException:参数数量错误),具体取决于String数组的大小. (3认同)