我正在尝试创建一个函数,该函数将在给定一组参数的情况下调用类的构造函数 包testytest;
import java.lang.reflect.Constructor;
public class MainClass {
public static <T> T newClass(Class<?> inst, Object ... args){
@SuppressWarnings("unchecked")
Constructor<?> [] ctor = (inst.getDeclaredConstructors());
int argIndex = 0;
ctorLoop: for(Constructor<?> x : ctor){
argIndex = 0;
for(Class<?> s : x.getParameterTypes()){
if(argIndex > args.length || args[argIndex++].getClass() != s){
if(argIndex <= args.length)
System.out.println("Param doesnt match : " + args[argIndex-1].getClass() + " with " + s);
continue ctorLoop;
}
}
try{
return (T)x.newInstance(args);
}catch(Exception e){
System.err.println("Error in instantiating instance of class : " + inst);
return null;
}
}
System.err.println("No instance of constructor found for class " + inst);
return null;
}
public static void main(String[] args) {
System.out.println(newClass(Double.class,5.0));
}
}
给了我错误
Param doesnt match : class java.lang.Double with double
Param doesnt match : class java.lang.Double with class java.lang.String
No instance of constructor found for class class java.lang.Double
看着这条线
Param doesnt match : class java.lang.Double with double
有没有办法本机地进行这个布尔匹配,而不需要交换每个本机类型(double,float,long,int等?)
答案 0 :(得分:2)
在包装器类中定义了常量,这些常量表示基元类型的Class
对象。对于double
,请使用Double.TYPE
。
表示基本类型
Class
的{{1}}实例。
这应该与您正在寻找的构造函数的假定double
参数匹配。
其他原语的其他示例包括double
,Integer.TYPE
,Float.TYPE
,Short.TYPE
,Byte.TYPE
,Long.TYPE
和{{1} }。 Character.TYPE
甚至Boolean.TYPE
。
答案 1 :(得分:1)
不,没有。引用类型java.lang.Double
和基元类型double
都具有相应的Class
个对象。没有办法从一个Class
对象转到另一个(装箱/拆箱)。
你必须保留自己的(bi)地图。
答案 2 :(得分:0)
执行此操作的简单方法是使用java.beans.Statement
。它会自动为您处理所有这些转换。