Java 如何通过反射获得原始包装类构造函数?
我试图通过Java中的反射创建一个新的原始包装器对象,我很难获得它们的构造函数。我尝试对一个String类做同样的事情,但没有出现问题(作为一个健全性测试,我可以使用接受StringBuilder的构造函数创建一个String对象),请参见下面的代码:Java 如何通过反射获得原始包装类构造函数?,java,Java,我试图通过Java中的反射创建一个新的原始包装器对象,我很难获得它们的构造函数。我尝试对一个String类做同样的事情,但没有出现问题(作为一个健全性测试,我可以使用接受StringBuilder的构造函数创建一个String对象),请参见下面的代码: try { Constructor<?>[] cons = String.class.getConstructors(); System.out.println(cons + " / " + cons.length);
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();
}
因此,当我请求字符串类构造函数时,我得到了一个由15个构造函数组成的数组。当我请求整数类型构造函数时,我得到一个0元素的数组(根本没有构造函数)
根据文档,Integer有2个构造函数(Integer(int)
和Integer(String)
)
有什么问题?如何使用反射获取整数类型的构造函数?当我尝试使用Integer.TYPE.getConstructor(String.class)
时,我得到一个NoSuchMethodException
是“表示基元类型的类实例int
”int
没有构造函数
使用
Integer.class
引用包装器类,包装器类确实如此。您需要Integer.class.getConstructors()
。Integer.TYPE==int.class
但是,您可能更喜欢Integer.valueOf。用于缓存整数。尝试使用
getDeclaredConstructors
而不是getConstructors
,您可能不需要构造函数。valueOf
方法更适合您的任务。使用Integer.class,而不是Integer.TYPE.class(请参见Joop的解释),我试图在一个泛型类(T extends Number)中实现这一点,该泛型类根据类的用户想要得到的内容将结果作为适当的类型返回(用户将所需的返回类型作为类参数传递给方法)。不幸的是,Number没有“valueOf”方法-它们是由子类(Integer、Float…等)定义的Number
是抽象的-并且每个t扩展Number
都有一个valueOf
方法。即使是字符
和布尔值
(不是数字)也有一个。也许你误解了我。您必须实现一个工厂方法(正如您已经实现的那样),但是您可以调用valueOf
factory方法,而不是调用构造函数。您的意思是:try{method m=type.getMethod(“valueOf”,String.class);output=(T)m.invoke(null,String.valueOf(input));}catch(异常e){e.printStackTrace();}
我说得对吗?我以为你的问题是创建一个整型的整型整型?而不是用整型值调用整型构造函数,你可以用反射在同一个整型值上调用Integer.valueOf。这更简单,因为你只需要原始值,包装器可以一般地派生。
[Ljava.lang.reflect.Constructor;@7852e922 / 15
java.lang.String : argument for StringBuilder
[Ljava.lang.reflect.Constructor;@4e25154f / 0