使用getDeclaredConstructor实例化Java类会引发IllegalArgumentException

时间:2013-06-04 11:30:30

标签: java reflection dynamic-programming variadic-functions

我有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?

2 个答案:

答案 0 :(得分:4)

这是varargs的一个问题。尝试:

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

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

答案 1 :(得分:2)

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

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