用getDeclaredConstructor实例化Java类会引发IllegalArgumentException异常



我有String[]构造函数类(没有默认构造函数):

我需要根据名称动态构造一个实例:

package tests;
import java.lang.reflect.Constructor;
interface I {
}
class A implements I {
    public A(String[] args) {
        System.out.printf("Args = %s", args.toString());
    }
}
public class DynaCon {
    public static void main(String[] args) throws Exception {
        @SuppressWarnings("unchecked")
        Class<I> clz = (Class<I>) Class.forName("tests.A");
        Constructor<I> ctr = clz.getDeclaredConstructor(args.getClass());
        ctr.newInstance(args);
    }
}

为什么会引发IllegalArgumentException ?

这是变量的一个问题。试一试:

I obj = ctr.newInstance(new Object[] { a });

Constructor.newInstance定义为T newInstance(Object... initargs)。由于String[]Object[](并且在J2SE 5.0之前工作),因此您正在尝试使用单个String接受参数调用构造函数。

Tom Hawtin是正确的,字符串数组被扩展为varargs参数。典型的解决方案是将其强制转换为非数组类型:

I obj = ctr.newInstance((Object)a);

相关内容

  • 没有找到相关文章

最新更新