如何通过反射获取基本包装类的构造函数?

4

我正在尝试通过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个构造函数的数组。但是,当我请求Integer类型构造函数时,我得到一个包含0个元素的数组(根本没有构造函数)。
根据文档,Integer有两个构造函数(Integer(int)和Integer(String))。
问题出在哪里?如何使用反射获得Integer类型的构造函数?当我尝试使用Integer.TYPE.getConstructor(String.class)时,我会得到一个NoSuchMethodException。

尝试使用getDeclaredConstructors而不是getConstructors,可能您不需要构造函数。valueOf方法更适合您的任务。并且使用Integer.class,而不是Integer.TYPE.class(请参见Joop的解释)。 - CoronA
好的,我正在尝试在一个泛型类中实现这个功能(T扩展了Number),根据类的使用者想要获取的内容(使用者通过方法传递所需的返回类型作为Class参数)返回适当类型的结果。不幸的是,Number没有"valueOf"方法 - 它们是由子类(Integer,Float等)定义的。 - hippieSabotage89
Number是抽象的 - 每个T extends Number都有一个valueOf方法。即使CharacterBoolean(它们不是数字)也有一个。也许你误解了我的意思。你必须实现一个工厂方法(就像你已经做的那样),但是不要调用构造函数,而是可以调用valueOf工厂方法。 - CoronA
这意味着目的不是将基本类型包装为包装类型,即int-> Integer,float-> Float,double-> Double。现在更像是将字符串转换为基本类型包装器,即String-> Integer,String-> Float,String-> Double。在这种情况下,工厂“parseXXX”将更通用。或者您是否计划将任何基本类型(和字符串)转换为包装类型。这将无法通过构造函数进行通用处理,因为并非所有包装类型都具有适用于所有基本类型和字符串的构造函数。 - CoronA
每个数字基本类型的包装类(Byte、Short、Int、Long、Float、Double)都有一个构造函数(String s)和valueOf(String s)方法。因此,只要a)它不超出包装器的范围b)我们不尝试将浮点数赋给整数类型之一(如果真的需要,我们可以先将浮点数转换为整数类型),就可以将任何基本类型转换为字符串,然后再转换为任何包装对象。 - hippieSabotage89
显示剩余3条评论
2个回答

4

Integer.TYPE表示原始类型int的类实例。 int没有构造函数。

使用Integer.class来引用包装类,该类具有构造函数。


3
你需要使用 Integer.class.getConstructors()。 Integer.TYPE == int.class。
不过你可能更喜欢使用 Integer.valueOf。因为它可以缓存一些整数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接