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()方法需要处理IllegalAccessExceptionInvocationTargetException(示例代码省略了异常处理,实际使用需注意)

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));      
}

测试逻辑:

  1. 创建Customer实例,故意将emailIdphoneNumber设为null
  2. 调用工具方法获取null字段名列表
  3. 验证结果是否包含预期字段名

4. 总结

通过组合Java 8 Stream API和Introspector,我们实现了:

  • ✅ 自动扫描所有getter方法
  • ✅ 高效筛选返回null的字段
  • ✅ 返回可读性强的字段名列表

这种方案特别适合需要批量检查对象空值的场景,比如:

  • 数据导入前的校验
  • API响应字段的空值检测
  • 调试时的快速字段检查

完整代码示例可在GitHub仓库获取。


原始标题:How to Find All Getters Returning Null Baeldung