1. Overview
In this quick article, we’ll use the Java 8 Stream API and the Introspector class – to invoke all getters found in a POJO.
We will create a stream of getters, inspect return values and see if a field value is null.
2. Setup
The only setup we need is to create a simple POJO class:
public class Customer {
private Integer id;
private String name;
private String emailId;
private Long phoneNumber;
// standard getters and setters
}
3. Invoking Getter Methods
We’ll analyze the Customer class using Introspector; this provides an easy way for discovering properties, events, and methods supported by a target class.
We’ll first collect all the PropertyDescriptor instances of our Customer class. PropertyDescriptor captures all the info of a Java Bean property:
PropertyDescriptor[] propDescArr = Introspector
.getBeanInfo(Customer.class, Object.class)
.getPropertyDescriptors();
Let’s now go over all PropertyDescriptor instances, and invoke the read method for every property:
return Arrays.stream(propDescArr)
.filter(nulls(customer))
.map(PropertyDescriptor::getName)
.collect(Collectors.toList());
The nulls predicate we use above checks if the property can be read invokes the getter and filters only null values:
private static Predicate<PropertyDescriptor> nulls(Customer customer) {
return = pd -> {
Method getterMethod = pd.getReadMethod();
boolean result = false;
return (getterMethod != null && getterMethod.invoke(customer) == null);
};
}
Finally, let’s now create an instance of a Customer, set a few properties to null and test our implementation:
@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));
}
4. Conclusion
In this short tutorial, we made good use of the Java 8 Stream API and an Introspector instance – to invoke all getters and retrieve a list of null properties*.*
As usual, the code is available over on GitHub.