使用场景
gson转换之后的对象如果不经过检查就使用,很容易导致空指针错误。json中的每一个数据都单独做检查,就会导致代码冗长,而且不利于维护,因此我做了一个小工具,用来在gson对字符串转换完成之后进行校验,避免在使用对象的过程中出现问题。
原理
主要利用的是反射的方法,使用getClass()函数获得对象的类型,getDeclaredFields函数可以获得这个类的所有成员变量,包括私有的变量,如果这个类没有任何变量,那么返回null,判断也就结束了。如果不为null,则对fields中的每一个元素进行检查,如果为null,则返回false,如果不是null,则把访问权限打开再进行判断。如果field类型是基础类型,不用进行后面的判断,因为会有默认值,永远不会为null。如果是字符串,则判断转换之后的字符串是否为空。如果是List,也就是json中的数组,按照同样的方法判断,因为大多数情况下,list里面跟的都是json字符串,反序列化之后,就是内部类,所以需要对list中的每个元素都进行递归调用,判断内部类中是否有空对象。最后就是json中value是另外 一个json了,也是进行递归调用,判断是否会返回false。
代码
/**
* created by 二仪式
* @param object
* @return
*/
public static boolean checkNull(Object object) {
try {
if (object == null) return false;
Class cls = object.getClass();
System.out.println("class=" + cls.toString());
if (cls.equals(String.class)) return true;
Field[] fields = cls.getDeclaredFields();
if (fields == null) return true;
for (int i = 0; i < fields.length; i++) {
if (fields[i] == null) {
System.out.println("field为空 " + cls.getTypeName());
return false;
}
fields[i].setAccessible(true);
if (fields[i].getType().isPrimitive()) continue;
if (fields[i].getType() == String.class) {
String temp = (String) fields[i].get(object);
if (temp == null) {
System.out.println("字符串为空 " + (fields[i].getName()));
return false;
}
}
if (fields[i].getType().equals(List.class)) {
List<Object> objs = (List<Object>) fields[i].get(object);
if (objs==null){
System.out.println("list为空对象 " + (fields[i].getName()));
return false;
}
for (int j = 0; j < objs.size(); j++) {
if (!checkNull(objs.get(j))) {
System.out.println("list中有空对象 " + (fields[i].getName()));
return false;
}
}
}
if (!checkNull(fields[i].get(object))) {
System.out.println("自定义对象有空对象 " + (fields[i].getName()));
return false;
}
System.out.println("field type =" + (fields[i].getName()));
}
} catch (Exception e) {
System.out.println("exception = " + e);
e.printStackTrace();
return false;
}
return true;
}