1. 概述
本文将介绍一种简单粗暴的方法:使用Java 8 Stream API和Introspector
类,快速检测POJO中所有返回null值的getter方法。我们将通过以下步骤实现:
- 创建getter方法流
- 检查返回值
- 筛选出返回null的字段
⚠️ 注意:此方案适用于需要批量检查对象字段空值的场景,比如数据校验或调试阶段。
2. 环境准备
只需创建一个简单的POJO类作为示例:
public class Customer {
private Integer id;
private String name;
private String emailId;
private Long phoneNumber;
// 标准getter和setter方法
}
这个Customer
类包含四个字段,后续我们将检测其中哪些字段的getter返回null。
3. 调用Getter方法
3.1 获取属性描述符
首先使用Introspector
分析Customer
类,它能轻松发现目标类的属性、事件和方法:
PropertyDescriptor[] propDescArr = Introspector
.getBeanInfo(Customer.class, Object.class)
.getPropertyDescriptors();
✅ 关键点:
getBeanInfo()
会返回所有属性描述符- 排除
Object.class
避免继承的干扰 PropertyDescriptor
包含Java Bean属性的所有元数据
3.2 筛选null值字段
接下来处理属性描述符数组,调用每个属性的read方法(即getter)并检查返回值:
return Arrays.stream(propDescArr)
.filter(nulls(customer))
.map(PropertyDescriptor::getName)
.collect(Collectors.toList());
核心逻辑在nulls
谓词中:
private static Predicate<PropertyDescriptor> nulls(Customer customer) {
return pd -> {
Method getterMethod = pd.getReadMethod();
return (getterMethod != null && getterMethod.invoke(customer) == null);
};
}
踩坑提醒:
- 必须检查
getterMethod != null
,否则可能抛出NullPointerException
invoke()
方法需要处理IllegalAccessException
和InvocationTargetException
(示例代码省略了异常处理,实际使用需注意)
3.3 测试验证
创建测试用例验证功能:
@Test
public void givenCustomer_whenAFieldIsNull_thenFieldNameInResult() {
Customer customer = new Customer(1, "John", null, null);
List<String> result = Utils.getNullPropertiesList(customer);
List<String> expectedFieldNames = Arrays
.asList("emailId","phoneNumber");
assertTrue(result.size() == expectedFieldNames.size());
assertTrue(result.containsAll(expectedFieldNames));
}
测试逻辑:
- 创建
Customer
实例,故意将emailId
和phoneNumber
设为null - 调用工具方法获取null字段名列表
- 验证结果是否包含预期字段名
4. 总结
通过组合Java 8 Stream API和Introspector
,我们实现了:
- ✅ 自动扫描所有getter方法
- ✅ 高效筛选返回null的字段
- ✅ 返回可读性强的字段名列表
这种方案特别适合需要批量检查对象空值的场景,比如:
- 数据导入前的校验
- API响应字段的空值检测
- 调试时的快速字段检查
完整代码示例可在GitHub仓库获取。