当前位置: 首页 > 面试题库 >

Java反射调用具有原始类型的构造函数

钱澄邈
2023-03-14
问题内容

我的测试框架中有一个方法可以创建类的实例,具体取决于传入的参数:

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)

原始int会自动装箱到对象版本中,但是如何返回它们以调用构造函数


问题答案:

使用Integer.TYPE代替Integer.class

根据Javadocs,这是“表示原始类型的Class实例int”。

您也可以使用int.class。这是的快捷方式Integer.TYPE。不仅是类,甚至对于原始类型,您都可以type.class用Java表示。



 类似资料:
  • 我有以下代码: 我要复制的类: 创建一些类 公共对象createObj(String cls\u name,String param1,int param2){返回Class.forName(cls\u name)。getConstructor(String.Class,Integer.Class)。newInstance(param1,param2);} 然后我尝试使用以下内容复制该类的对象:

  • 问题内容: 如果我有一个像这样的抽象类: 还有一些从Item派生的类是这样的: 我不明白为什么我不能使用泛型调用构造函数: 我知道可以有一个没有构造函数的类型,但是这种情况是不可能的,因为Pencil具有没有参数的构造函数,而Item是抽象的。但是我从eclipse中得到了这个错误: 无法实例化 我不明白为什么的 T类型 ,以及如何避免这种情况? 问题答案: 无法使用Java类型系统来强制类层次结

  • 我对Java中的原语类型有一个问题。我使用的是JDK1.6。 如果我有以下信息: 编译器不想编译——它说它“无法从int转换为short”,并建议我转换为,因此: 真的管用。但我的问题是,我为什么要投?a和b的值在-短值范围为{-32768,32767}的范围内。当我想执行操作时,我还需要强制转换-,*,/(我还没有检查其他操作)。 如果我对基元类型执行相同的操作,我不需要将aa bb强制转换为。

  • 我试图在静态编程语言中创建一个非常简单的泛型NDArray类,它将lambda表达式作为初始化函数。 典型的用法是: 我的问题是Kotlin编译器抱怨构造函数中值的初始化 通过说“不能使用‘T’作为具体化类型参数。改用类”。为什么? 编辑: 如果我用我自己的MyArray替换静态编程语言Array实现,它会编译: 不确定为什么静态编程语言对待MyArray与常规数组不同,当两者具有相同的构造函数时

  • 无论我用什么方法尝试,无论是主构造函数还是次构造函数,我都不知道如何在kotlin中声明一个带有超类和构造函数的新类。 这是我最想做的,但它给出了一个错误,期望成员声明。 这是我认为主要构造函数的外观,但它给出了相同的错误。在Internet上搜索没有帮助,我只能找到第二个示例。 那么,用一个超类和它的一个构造函数创建一个类的所有有效方法是什么呢?

  • 首先,这更像是一个理智检查问题,以获得比我更精通语言标准深度的人的认可。 假设我有以下类型(尽管我忽略了任何非构造函数和非赋值成员函数): 好吧,在任何合理的实现中,在内存中都不应该是普通的。但我对标准的保证很感兴趣。以下是我根据C 98/03定义POD的理由: 不能是 POD 类型,因为它具有非公共字段、基类和用户定义的构造函数。 和C 11的losened/扩展定义: > 它应该是微不足道的可