如何根据不同输入动态验证POJO的非空字段?
动态POJO字段非空验证实现
核心实现代码
基于Java反射机制实现动态字段非空校验,以下是nullCheck方法的完整实现:
import java.lang.reflect.Field; import java.util.List; public class FieldValidator { public boolean nullCheck(MyPOJO pojo, List<String> nonNullFields) { // 空值防御:POJO实例或字段列表为空时直接返回校验失败 if (pojo == null || nonNullFields == null || nonNullFields.isEmpty()) { return false; } Class<?> pojoClass = pojo.getClass(); for (String fieldName : nonNullFields) { try { // 获取目标字段,开启私有字段访问权限 Field field = pojoClass.getDeclaredField(fieldName); field.setAccessible(true); // 获取字段值并校验是否为空(含空串、纯空格) Object value = field.get(pojo); if (value == null || ((String) value).trim().isEmpty()) { return false; } } catch (NoSuchFieldException e) { // 传入的字段名不存在,校验失败 return false; } catch (IllegalAccessException e) { // 字段访问权限异常,校验失败 return false; } } // 所有指定字段均非空,校验通过 return true; } } // 你的POJO定义(注意字段名拼写:filed3而非field3) class MyPOJO { private String field1; private String field2; private String filed3; // 建议添加标准getter/setter方法 public String getField1() { return field1; } public void setField1(String field1) { this.field1 = field1; } public String getField2() { return field2; } public void setField2(String field2) { this.field2 = field2; } public String getFiled3() { return filed3; } public void setFiled3(String filed3) { this.filed3 = filed3; } }
使用示例
import java.util.List; public class Demo { public static void main(String[] args) { FieldValidator validator = new FieldValidator(); MyPOJO pojo = new MyPOJO(); pojo.setField1("valid1"); pojo.setField2("valid2"); pojo.setFiled3("valid3"); // 校验field1和field2非空 boolean result1 = validator.nullCheck(pojo, List.of("field1", "field2")); System.out.println(result1); // 输出true // 仅校验filed3非空 boolean result2 = validator.nullCheck(pojo, List.of("filed3")); System.out.println(result2); // 输出true // 传入错误字段名(POJO中是filed3而非field3) boolean result3 = validator.nullCheck(pojo, List.of("field3")); System.out.println(result3); // 输出false } }
关键细节说明
- 空值防御:提前判断POJO实例和字段列表的空值情况,避免后续抛出空指针异常
- 私有字段访问:通过
setAccessible(true)突破私有字段的访问限制,无需修改POJO的封装性 - 空值判断逻辑:同时校验
null、空串、纯空格场景,可根据业务需求调整为仅校验null - 异常处理:捕获字段不存在、访问权限异常,直接返回校验失败
性能优化方案
如果校验方法被频繁调用,可通过缓存字段对象减少反射开销:
import java.lang.reflect.Field; import java.util.HashMap; import java.util.List; import java.util.Map; public class FieldValidator { private static final Map<Class<?>, Map<String, Field>> FIELD_CACHE = new HashMap<>(); public boolean nullCheck(MyPOJO pojo, List<String> nonNullFields) { if (pojo == null || nonNullFields == null || nonNullFields.isEmpty()) { return false; } Class<?> pojoClass = pojo.getClass(); // 缓存当前类的字段映射,避免重复反射 FIELD_CACHE.computeIfAbsent(pojoClass, cls -> { Map<String, Field> fieldMap = new HashMap<>(); for (Field field : cls.getDeclaredFields()) { field.setAccessible(true); fieldMap.put(field.getName(), field); } return fieldMap; }); Map<String, Field> fieldMap = FIELD_CACHE.get(pojoClass); for (String fieldName : nonNullFields) { Field field = fieldMap.get(fieldName); if (field == null) { return false; } try { Object value = field.get(pojo); if (value == null || ((String) value).trim().isEmpty()) { return false; } } catch (IllegalAccessException e) { return false; } } return true; } }
内容的提问来源于stack exchange,提问作者Wolfisher
相关产品推荐
相关产品推荐

