我有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);