我的测试框架中有一个方法可以创建一个类的实例,具体取决于传入的参数:
public void test(Object... constructorArgs) throws Exception {
Constructor<T> con;
if (constructorArgs.length > 0) {
Class<?>[] parameterTypes = new Class<?>[constructorArgs.length];
for (int i = 0; i < constructorArgs.length; i++) {
parameterTypes[i] = constructorArgs[i].getClass();
}
con = clazz.getConstructor(parameterTypes);
} else {
con = clazz.getConstructor();
}
}
问题是,如果构造函数有原始类型,这不起作用,如下:
public Range(String name, int lowerBound, int upperBound) { ... }
.test("a", 1, 3);
结果:
java.lang.NoSuchMethodException: Range.<init>(java.lang.String, java.lang.Integer, java.lang.Integer)
原始整数被自动装箱到对象版本中,但我如何让它们回来以调用构造函数?
最佳答案
使用 Integer.TYPE
代替 Integer.class
。
根据 Javadocs ,这是“代表原始类型 int
的 Class 实例。”
您也可以使用 int.class
。它是 Integer.TYPE
的快捷方式。不仅是类,甚至对于原始类型,您都可以在 Java 中说 type.class
。
关于具有原始类型的 Java 反射调用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3925587/