我正在尝试通过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的解释)。 - CoronANumber
是抽象的 - 每个T extends Number
都有一个valueOf
方法。即使Character
和Boolean
(它们不是数字)也有一个。也许你误解了我的意思。你必须实现一个工厂方法(就像你已经做的那样),但是不要调用构造函数,而是可以调用valueOf
工厂方法。 - CoronA