上一篇博客 将一个对象里所有的空值属性设置成null 有个漏洞,
初次接触反射的同学还是建议看我上一篇的博客,看懂了再来看这篇
最近比较有空,重新研究了一下反射,发现反射在获取属性的时候getDeclaredFields()这个方法只能获取本类的属性,无法获得超类的属性,然而在实际编程中,都是各种继承,所以就必须将超类也考虑进去 ,
然并卵,又要死好多脑细胞了,因为你不知道到底有多少超类,所以递归,老实的用起来吧
/**
* 将一个对象里所有的空值属性设置成null
*
* @param o
* @return
*/
public Object changeToNull(Object o) {
Class c = o.getClass();
Class sc = c.getSuperclass();
if (null != sc) {
recursionNull(sc, o);
}
try {
Field[] fs = c.getDeclaredFields();
for (Field f : fs) {
f.setAccessible(true);
String st = f.get(o) + "";
String str = st.replaceAll(" ", "");
if (str.equals("") || str == null || str.equals("null")) {
f.set(o, null);
}
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return o;
}
/**
* 判断是否有超类,若有则继续将超类的空值置空
* @param sc
* @param o
* @return
*/
public Object recursionNull(Class sc,Object o) {
Class c =sc.getSuperclass();
if (null != c) {
recursionNull(c,o);
}
try {
Field[] fs = sc.getDeclaredFields();
for (Field f : fs) {
f.setAccessible(true);
String st = f.get(o) + "";
String str = st.replaceAll(" ", "");
if (str.equals("") || str == null || str.equals("null")) {
f.set(o, null);
}
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return o;
}