如何查找所有返回Null的Getter

2023/05/31

1. 概述

在这篇简短的文章中,我们将使用Java 8 Stream API和Introspector类来调用在POJO中找到的所有getter。

我们将创建一个getter流,检查返回值并查看字段值是否为null。

2. 设置

我们唯一需要的设置是创建一个简单的POJO类:

public class Customer {

	private Integer id;
	private String name;
	private String emailId;
	private Long phoneNumber;

	// standard getters and setters
}

3. 调用Getter方法

我们将使用Introspector分析Customer类;这为发现目标类支持的属性、事件和方法提供了一种简单的方法。

我们首先收集Customer类的所有PropertyDescriptor实例,PropertyDescriptor捕获Java Bean属性的所有信息:

PropertyDescriptor[] propDescArr = Introspector
	.getBeanInfo(Customer.class, Object.class)
    .getPropertyDescriptors();

现在我们遍历所有PropertyDescriptor实例,并为每个属性调用read方法:

return Arrays.stream(propDescArr)
    .filter(nulls(customer))
    .map(PropertyDescriptor::getName)
    .collect(Collectors.toList());

我们在上面使用的null谓词检查是否可以读取属性调用getter并仅过滤null值:

private static Predicate<PropertyDescriptor> nulls(Customer customer) { 
    return = pd -> { 
        Method getterMethod = pd.getReadMethod(); 
        boolean result = false; 
        return (getterMethod != null && getterMethod.invoke(customer) == null); 
    }; 
}

最后,我们现在创建一个Customer的实例,将一些属性设置为null并测试我们的实现:

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

4. 总结

在这个简短的教程中,我们充分利用了Java 8 Stream API和Introspector实例调用所有getter并检索空属性列表。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章