Перейти к основному содержимому

Как найти все геттеры, возвращающие null

· 2 мин. чтения

1. Обзор

В этой быстрой статье мы будем использовать Java 8 Stream API и класс Introspector для вызова всех геттеров, найденных в POJO.

Мы создадим поток геттеров, проверим возвращаемые значения и посмотрим, является ли значение поля нулевым.

2. Настройка

Единственная настройка, которая нам нужна, — это создать простой класс POJO:

public class Customer {

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

// standard getters and setters
}

3. Вызов методов получения

Мы проанализируем класс Customer с помощью Introspector ; это обеспечивает простой способ обнаружения свойств, событий и методов, поддерживаемых целевым классом.

Сначала мы соберем все экземпляры PropertyDescriptor нашего класса Customer . PropertyDescriptor фиксирует всю информацию о свойстве Java Bean:

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

Давайте теперь пройдемся по всем экземплярам PropertyDescriptor и вызовем метод чтения для каждого свойства:

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();
boolean result = false;
return (getterMethod != null && getterMethod.invoke(customer) == null);
};
}

Наконец, давайте теперь создадим экземпляр Customer , установим для нескольких свойств значение null и протестируем нашу реализацию:

@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. Вывод

В этом кратком руководстве мы хорошо использовали API Java 8 Stream и экземпляр Introspector — для вызова всех геттеров и получения списка нулевых свойств .

Как обычно, код доступен на GitHub .