功能描述:
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;}