关于反射,希望高手赐教
关于反射的问题:我想遍历一个未知类的构造器,然后获取构造器参数类型,根据构造器参数类型去动态传入一个数,组成参数数组,最后用这个数组做参数去创建一个对象
但是怎么动态的确定这个参数数组的数的类型,也就是代码中
** parameterarr[i]= //这里不会了
这里怎么写?
希望高手可以赐教
Class<?> UnKnownClass = Class.forName //获取类对象 ("com.swu.hc.data_dataType_dataOperate.Reflect");
// 获取未知类的所有构造方法
Constructor<?>[] constructor = UnKnownClass.getDeclaredConstructors();
Class[] parameterTypes=null; //参数类型数组
Object[] parameterarr=null; //供反射构造使用的参数数组
for (Constructor<?> constructor2 : constructor) {
// 获取构造器的参数信息,放到class数组里
parameterTypes= constructor2.getParameterTypes();
parameterarr = new Object[parameterTypes.length];
for (int i=0;i<parameterarr.length;i++) {
/** parameterarr[i]= //这里不会了
* 我的要求是比如某次循环时参数类型为int 于是把一个int数比如12,放进数组
* 下次要是string,就提示用户传入string
*/
}
constructor2.newInstance(parameterarr);
}
java反射问题
------解决方案--------------------protected T newInstance(Object... args){
Class<T> t = GetGeneralClass();
Class[] argClazz = new Class[args.length];
int i = 0;
//如果有外部类,那么将外部类的Class放到第一个位置,如果没有外部类,那么就说明不是内部类,不用做额外操作了
if(!Modifier.isStatic(t.getModifiers())){
Class superClass = t.getEnclosingClass(); //最近的外部类Class
if(superClass != null){ //最外层的公开类,也不是静态的,不过它没有外部类
argClazz[0] = superClass;
i++;
}
}
for(; i < args.length; i++){
//所有值类型参数都是通过装箱进来的,int会变成Integer、float会编程Float等等,而这些装箱后的Number类型要注意,比如Integer.class和int.class是不一样的,constructor(Integer x)和constructor(int x)是两个不同的构造函数
//所以,要把所有的Number.class变成Primitive.class(Primitive是指int、float、boolean、byte、double、long、short、char、void九种类型)
if(args[i] instanceof Number){
Class primitiveClass = null;
try {
//Number的所有子类里面,都有静态字段TYPE,比如Integer.TYPE的值是int.class,Float.TYPE的值是float.class
primitiveClass = (Class) args[i].getClass().getDeclaredField("TYPE").get(null);
} catch (Exception e) {
e.printStackTrace();
}
argClazz[i] = primitiveClass; //将所有Number.class替换为Primitive.class(int.class、float.class、boolean.class的统称)
}else{
argClazz[i] = args[i].getClass();
}
}
try {
Constructor<T> c = t.getDeclaredConstructor(argClazz);
c.setAccessible(true);
return c.newInstance(args);
} catch (Exception e) {
e.printStackTrace();
}
return null;