一个方法以类cls
作为参数,我需要实例化一个cls对象。
如下:
private void foo(Class<?> cls){
cls bar = new cls();
...
}
例如,假设cls是Integer.class(但解决方案适用于任何类)。 如何在该方法中实例化一个Integer?
答案 0 :(得分:1)
您可以检查类型并创建一个新整数:
if(cls == Integer.class) return Integer.valueOf(0);
或
if(cls == Integer.class) {
return cls.getConstructor(int.class).newInstance(0);
}
但是,此方法仍会返回一个对象,而不是Integer
的实例。
更好的选择可能是:
static <T extends Number> T newNumber1(Class<T> tClass, String s){
if(tClass == Integer.class){
return (T) Integer.valueOf(s);
}
}
// OR
static Number newNumber2(Class<? extends Number> tClass, String s){
if(tClass == Integer.class){
return Integer.valueOf(s);
}
}
用法:
int v1 = newNumber1(Integer.class, "5");
int v2 = newNumber2(Integer.class, "6").intValue();
<强>更新强>:
static <T> T newInstance(Class<T> tClass, String s) throws Exception{
return tClass.getConstructor(String.class).newInstance(s);
}
public static void main(String[] args) throws Exception{
Double d = newInstance(Double.class, "4");
System.out.println(d);
}
答案 1 :(得分:1)
由于Integer
类没有0-arg构造函数,因此您无法在此处直接使用Class#newInstance()
方法。
相反,您可以使用Class#getConstructor()
方法获取String
或int
参数的相应构造函数。然后使用以下方法创建实例:
Class<Integer> clazz = Integer.class;
Integer value = clazz.getConstructor(String.class).newInstance("5");
答案 2 :(得分:-1)
我假设您一直在询问一般情况 - 如何创建一个传递给这种方法的类的实例。显然,如果您只是意味着&#34;我如何创建Integer
&#34;,那么它与该方法无关。
public T newInstance()
throws InstantiationException,
IllegalAccessException
创建此Class对象表示的类的新实例。该类实例化为具有空参数列表的新表达式。如果尚未初始化,则初始化该类。
显然,这对Integer
不起作用,因为Integer
没有带有空参数列表的构造函数。
答案 3 :(得分:-1)
如果你在反射方法中使用它,我认为你应该使用
Integer.TYPE