日期:2014-05-20  浏览次数:20573 次

通过反射创建对象(前提,无法知道被创建对象构造函数情况)
功能描述:

  1. 获取一个类中的所有域。

  2. 根据获取的域信息,为域赋值。

问题描述:

  由于域信息可能为一个自定义类对象,因此在这里我们无法得知此类的构造函数信息。  
   
  请问,在这种情况下,有没有方法来初始化域对象?

------解决方案--------------------
如果是静态域(变量)可以不实例化该类,但如果不是静态域,必须实例化。

所以一般来说,该类要提供缺省构造函数;带参数构造函数也行,但你就知道参数该怎么传递了。
------解决方案--------------------
这个有难度,连构造方法信息都不知道,如果LZ有时间,可以写个递归试试看
for example
Java code
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;
}