关于反射的问题:我想遍历一个未知类的构造器,然后获取构造器参数类型,根据构造器参数类型去动态传入一个数,组成参数数组,最后用这个数组做参数去创建一个对象但是怎么动态的确定这个参数数组的数的类型,也就是代码中
**   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反射问题

解决方案 »

  1.   

    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;
    }
      

  2.   

    哦,函数中第一行 Class<T> t = GetGeneralClass(); 改成自己的Class: