循环对象中的属性,并给属性设值
在写代码的时候经常会需要去循环一个class对象中的所有属性。
首先需要获取这个对象的所有属性,通过getClass().getDeclaredFields()这个方法就可以获取对象的所有属性,获取到的是一个Field[数组Field[],如下
Object obj = new Object();
Field[] rootFields = obj.getClass().getDeclaredFields();
然后对这个数组进行循环即可,循环中数组的对象我们可以看到是Field 类型的
for (Field rootField : rootFields)
1、rootField.getType().getName()可以获取属性的类型,即这个属性是Object类型,List类型,还是其它的。
String rfClassName = rootField.getType().getName();
List类型:rfClassName.equals("java.util.List")
String类型:rfClassName.equals("java.lang.String")
BigDecimal:类型:rfClassName.equals("java.math.BigDecimal")
int:类型:rfClassName.equals("java.lang.Integer")
其它的不全部列了
2、个性某个属性的值
- 如果属性类型rfClassName是String、int、BigDecimal这种非对象、或者对象集合的类型,
则可以直接rootField.set(obj, "abc")给obj对象的rootField这个属性设置为"abc"
或者可以直接rootField.set(obj, BigDecimal.ZERO)给obj对象的rootField这个属性设置为BigDecimal.ZERO
或者可以直接rootField.set(obj, new Integer(0))给obj对象的rootField这个属性设置为0
- 如果属性类型是对象类型,则需要先rootField.getType().newInstance()通过这个方法先去new一个对象出来,然后再通过
rootField.set(obj, subObj)这个方法给它设置一个属性,代码如下,原理其实和上面几种类型一致。
Object subObj = rootField.getType().newInstance();
rootField.set(obj, subObj);
- 如果属性类型是List类型,先需要List list = (List<?>) rootField.get(obj);获取这个list属性,获取去获取这个List的保存的数据类 型Class<?> clazz = map.get(rootField.getName());再通过这个获取到的数据类型class去new一个对象Object subObj1 = clazz.newInstance();最后把对象subObj1 追加到list中,代码如下
Class<?> clazz = map.get(rootField.getName());
List list = (List<?>) rootField.get(obj);
Object subObj1 = clazz.newInstance();
Object subObj2 = clazz.newInstance();
init(subObj1, map);
init(subObj2, map);
list.add(subObj1);
list.add(subObj2);
其实原理都是差不多的,1、获取属性类型,2、根据类型new一个对象,new Integer(0)、clazz.newInstance()、rootField.getType().newInstance(),3、把新对象或值设置给属性
以下是我以前写的一个代码,供参考
publicstaticvoid init(Object obj, Map<String, Class> map) {
try {
Field[] rootFields = obj.getClass().getDeclaredFields();
for (Field rootField : rootFields) {
rootField.setAccessible(true);
String rfClassName = rootField.getType().getName();
if (rfClassName.equals("java.util.List")) {
Class<?> clazz = map.get(rootField.getName());
List list = (List<?>) rootField.get(obj);
Object subObj1 = clazz.newInstance();
Object subObj2 = clazz.newInstance();
init(subObj1, map);
init(subObj2, map);
list.add(subObj1);
list.add(subObj2);
} elseif (rfClassName.equals("java.lang.String")) {
rootField.set(obj, "");
} elseif (rfClassName.equals("java.math.BigDecimal")) {
rootField.set(obj, BigDecimal.ZERO);
}elseif (rfClassName.equals("java.lang.Integer")) {
rootField.set(obj, new Integer(0));
} else {
Object subObj = rootField.getType().newInstance();
rootField.set(obj, subObj);
init(subObj, map);
}
}
} catch (Exception e) {
}
}