Java反射错误: Wrong number of arguments

标签 java reflection constructor

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

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/

相关文章:

Java泛型类和通配符

c# - 哪些资源解释了 C# 中的反射和元编程?

java - Java构造函数中的循环依赖

javascript - 如何在 IIFE 中包装构造函数并将实例放置在 Window 对象上?

java - 如何找到小程序支持的 APDU 列表?

java - 我如何更改方法append(int n)中的 "this"?

reflection - 使用obj::class.declaredMemberProperties查找字段注释

java - 在Java中查找调用方法

c++ - 从成员函数调用构造函数

java - 我应该如何检查 Stream<T> 是否已排序?