-
问题: 在开发中, 对参数校验的时候, 有时需要检查传入的pojo进行参数校验, 传入的参数又需要满足不能全为空这个条件, 这时需要用到反射的方法, 对传入的对象进行属性校验..
-
举个栗子
-
新建一个User对象, imlements Serializable. 其中 serialVersionUID, id 是不是空, 不关心. 但是希望 name, age 两个字段不能全部为空.
-
new一个user对象, 并将"serialVersionUID", "id"丢入List<String> excludeNames中, 进行测试
public class User implements Serializable {
private static final long serialVersionUID = 1L; // 这个必然是不为空的, 不关心
private Integer id; // id 是不是为空, 不关心
private String name; // 名字, 希望name和age不要都为空
private Integer age; // age
/* getter 和 setter 方法, 不列出 */
}
public static void main(String[] args) throws Exception {
// 将不关心的字段丢入excludeNames
List<String> excludeNames = new ArrayList<String>();
excludeNames.add("serialVersionUID");
excludeNames.add("id");
// 关心的字段全部为空的情况
User user = new User();
user.setName("");
System.err.println(isAllFieldNull(user, excludeNames));
System.out.println("===============");
// 关心的字段不全部为空的情况
user.setAge(18);
System.err.println(isAllFieldNull(user, excludeNames));
}
/****************** 以下是判断的方法 *****************/
/**
* 判断该对象的一部分属性是否全部为空
* @param obj 对象
* @param excludeNames 选择忽略校验的属性名称List集合
* @return boolean
* @throws Exception
*/
public static boolean isAllFieldNull(Object obj, List<String> excludeNames) throws Exception{
// 取到obj的class, 并取到所有属性
Field[] fs = obj.getClass().getDeclaredFields();
// 定义一个flag, 标记是否所有属性值为空
boolean flag = true;
// 遍历所有属性
for (Field f : fs) {
f.setAccessible(true); // 设置私有属性也是可以访问的
// 1.排除不包括的属性名, 2.属性值不为空, 3.属性值转换成String不为""
if(!excludeNames.contains(f.getName()) && f.get(obj) != null && !"".equals(f.get(obj).toString())) {
// 有属性满足3个条件的话, 那么说明对象属性不全为空
flag = false;
break;
}
}
return flag;
}