功能描述:    1. 获取一个类中的所有域。    2. 根据获取的域信息,为域赋值。问题描述:    由于域信息可能为一个自定义类对象,因此在这里我们无法得知此类的构造函数信息。   
    
    请问,在这种情况下,有没有方法来初始化域对象?

解决方案 »

  1.   

    请参考java.lang.Class类getFields() 
              返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
    这个方法可以返回该类的所有非私有的域名。得到后给域赋值请参考java.lang.reflect.Method类
    invoke(Object obj, Object... args) 
              对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。将你要赋的值invoke进去即可
      

  2.   

    这个有难度,连构造方法信息都不知道,如果LZ有时间,可以写个递归试试看
    for example
    public Object newInstance(Class c) {
        if (c==boolean.class || c==Boolean.class) { //基本类型,直接返回
            return new Boolean(false); 
        } else if (c==byte.class || c==Byte.class) { //其他的LZ自己补充
            return new Byte(0);
        } else if (c==short.class || c==Short.class) {    } else if (c==char.class || c==Character.class) {    } else if (c==int.class || c==Integer.class) {    } else if (c==long.class || c==Long.class) {    } else if (c==float.class || c==Float.class) {    } else if (c==double.class || c==Double.class) {    } else if (c==String.class) {    } else if (c.isArray()) { //数组    }    Object o = null;
        Constructor con = c.getConstructors()[0]; //因为不知道构造方法信息,取第一个构造方法
        con.setAccessible(true);
        Class[] pc = con.getParameterTypes(); //获取构造方法参数
        Object[] vals = new Object[pc.length];
        for (int i=0; i<pc.length; i++) {
            vals[i] = newInstance(pc[i]); //递归获取参数的实例
        }
        o = con.newInstance(vals); //生成实例    //可以继续设置属性
        for (Field f : c.getDeclaredFields()) {
            Class fc = f.getType();
            f.setAccessible(true);
            if (f.get(o) == null) {
                Object fo = newInstance(fc); //递归获得属性实例
                 f.set(fo);
            }
       }    return o;
    }
      

  3.   

    翻了下spring源码,如果不知道构造函数的话,貌似不能搞。