一、需求
@Data public class Student { /** * id */ private Long id; /** * 姓名 */ private String name; /** * 性别 */ private Integer sex; /** * 民族 */ private Integer nation; }
有一个学生对象,有ID、姓名、性别、民族四个属性。业务1推展需要,学员姓名、性别、名族不能为空;业务2、需要学员的姓名、性别不能为空;
为什么不让学员都填了?实际业务中属性可能几十项,数据略微敏感,我们只在单一业务需要的时候,找学员提供。
二、检查工具类
import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; public class FieldUtils { public static List<String> checkObjFieldIsNull(Object obj, List<String> checkField) throws IllegalAccessException { List<String> res = new ArrayList<>(); //获取对象的类 Class<?> aClass = obj.getClass(); //获取对象的所有字段,包含public、private和proteced Field[] declaredFields = aClass.getDeclaredFields(); //遍历对象的所有属性 for (Field field : declaredFields) { //反射的对象在使用时应该取消 Java 语言访问检查,提高性能 field.setAccessible(true); String fieldName = field.getName(); //检查是对象属性是否是受检对象 if (checkField.contains(fieldName)) { //受检对象是否是空 if (field.get(obj) == null) { res.add(fieldName); } //字符串类型的空字符串判断 Class<?> type = field.getType(); if ((String)field.get(obj)=="") { res.add(fieldName); } } } return res; } }
三、实例代码
@Test void test01() throws IllegalAccessException { Student st = new Student(); st.setName("张三"); st.setId(5L); System.out.println("学员信息:"+JSON.toJSONString(st)); List<String> checkField01 = Arrays.asList("name", "sex", "nation"); List<String> nullFieldList01 = FieldUtils.checkObjFieldIsNull(st, checkField01); System.out.println("业务检查字段:"+JSON.toJSONString(checkField01)+"检查为空字段:"+JSON.toJSONString(nullFieldList01)); List<String> checkField02 = Arrays.asList("name", "sex"); List<String> nullFieldList02 = FieldUtils.checkObjFieldIsNull(st, checkField02); System.out.println("业务检查字段:"+JSON.toJSONString(checkField02)+"检查为空字段:"+JSON.toJSONString(nullFieldList02)); }
学员信息:{"id":5,"name":"张三"} 业务检查字段:["name","sex","nation"]检查为空字段:["sex","nation"] 业务检查字段:["name","sex"]检查为空字段:["sex"]