如何通过反射获取原始包装类构造函数?

时间:2018-01-02 11:55:08

标签: java

我试图通过Java中的反射创建一个新的原始包装器对象,我很难得到它们的构造函数。我尝试使用String类做同样的事情没有问题(作为一个完整性测试,我可以使用接受StringBuilder的构造函数创建一个String对象)请参阅下面的代码:

try {
    Constructor<?>[] cons = String.class.getConstructors();
    System.out.println(cons + " / " + cons.length);
    Constructor<String> con = String.class.getConstructor(StringBuilder.class);
    String test = con.newInstance(new StringBuilder("argument for StringBuilder"));
    System.out.println(test.getClass().getName() + " : " + test);

    Constructor<?>[] consInteger = Integer.TYPE.getConstructors();
    System.out.println(consInteger + " / " + consInteger.length);

} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

输出是:

[Ljava.lang.reflect.Constructor;@7852e922 / 15
java.lang.String : argument for StringBuilder
[Ljava.lang.reflect.Constructor;@4e25154f / 0

因此,当我要求String类构造函数时,我得到一个包含15个构造函数的Array。当我要求Integer类型构造函数时,我得到一个0元素的数组(根本没有构造函数)。

根据文档,Integer有2个构造函数(Integer(int)Integer(String))。

有什么问题?如何使用反射获取Integer类型的构造函数?当我尝试使用Integer.TYPE.getConstructor(String.class)时,我得到NoSuchMethodException

2 个答案:

答案 0 :(得分:4)

Integer.TYPE是“表示基本类型int的类实例。” int没有构造函数。

使用Integer.class来引用包装类,它可以。

答案 1 :(得分:3)

您需要Integer.class.getConstructors()。 Integer.TYPE == int.class。

但是您可能更喜欢Integer.valueOf。用于缓存整数。