2

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

4

2 回答 2

4

这是可变参数的问题。尝试:

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

Constructor.newInstance定义为T newInstance(Object... initargs)。正如String[]Object[]并且在 J2SE 5.0 之前工作)一样,您正在尝试使用单个String-accepting 参数调用构造函数。

于 2013-06-04T11:31:38.050 回答
2

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

I obj = ctr.newInstance((Object)a);
于 2013-06-06T01:02:45.983 回答