Java 反射调用具有基元类型的构造函数

2022-08-31 19:41:29

我的测试框架中有一个方法,它根据传入的参数创建类的实例:

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)

原始 ints 被自动装箱到对象版本中,但是我如何将它们取回以调用构造函数?


答案 1

请代替 使用 。Integer.TYPEInteger.class

根据Javadocs,这是“表示基元类型的类实例”。int

您也可以使用 .这是 的快捷方式。不仅是类,即使是基元类型,您也可以用Java说。int.classInteger.TYPEtype.class


答案 2

要引用基元类型,请使用,例如:

Integer.TYPE;

您需要知道传递给方法的哪些参数是基元值。您可以使用以下命令执行此操作:

object.getClass().isPrimitive()