/**
* 判断是否对象所有属性都为null, 或空字符串(继承的属性不考虑在内)
* @param obj
* @return
* @throws IllegalAccessException
*/
public static boolean isAllPropEmpty(Object obj) throws IllegalAccessException {
Field[] declaredFields = obj.getClass().getDeclaredFields();
for (Field declaredField : declaredFields) {
declaredField.setAccessible(true);
Object value = declaredField.get(obj);
if (value != null){
if (! (value instanceof String)){
return false;
}else if(!((String) value).matches("^\\s*$")){
return false;
}
}
}
return true;
}
如图方法,在测试环境发现无法准确工作;通过日志输出发现有个奇怪的字段“$jacocoData”;
因为测试环境加入了jacoco做代码覆盖率统计,但是不知道会有这种影响;对于这种编译器加入的字段,可以通过isSynthetic来判断,所以,原有方法可以修改为:
/**
* 判断是否对象所有属性都为null, 或空字符串(继承的属性不考虑在内)
* @param obj
* @return
* @throws IllegalAccessException
*/
public static boolean isAllPropEmpty(Object obj) throws IllegalAccessException {
Field[] declaredFields = obj.getClass().getDeclaredFields();
for (Field declaredField : declaredFields) {
if (declaredField.isSynthetic()){
//针对某些情况,编译器会引入一些字段,需要过滤掉
continue;
}
declaredField.setAccessible(true);
Object value = declaredField.get(obj);
if (value != null){
if (! (value instanceof String)){
return false;
}else if(!((String) value).matches("^\\s*$")){
return false;
}
}
}
return true;
}