1. Обзор
В этой краткой статье мы будем использовать потоковый API Java 8 и класс Introspector – для вызова всех геттеров, найденных в POJO.
Мы создадим поток желобов, проверим возвращаемые значения и посмотрим, является ли значение поля null.
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 захватывает всю информацию о свойстве JavaBean:
PropertyDescriptor[] propDescArr = Introspector .getBeanInfo(Customer.class, Object.class) .getPropertyDescriptors();
Теперь давайте рассмотрим все экземпляры PropertyDescriptor и вызовем метод read для каждого свойства:
return Arrays.stream(propDescArr) .filter(nulls(customer)) .map(PropertyDescriptor::getName) .collect(Collectors.toList());
Предикат nulls , который мы используем выше, проверяет, можно ли прочитать свойство, вызывает геттер и фильтрует только нулевые значения:
private static Predicatenulls(Customer customer) { return = pd -> { Method getterMethod = pd.getReadMethod(); boolean result = false; return (getterMethod != null && getterMethod.invoke(customer) == null); }; }
Наконец, давайте теперь создадим экземпляр Customer , установим несколько свойств равными нулю и протестируем нашу реализацию:
@Test public void givenCustomer_whenAFieldIsNull_thenFieldNameInResult() { Customer customer = new Customer(1, "John", null, null); Listresult = Utils.getNullPropertiesList(customer); List expectedFieldNames = Arrays .asList("emailId","phoneNumber"); assertTrue(result.size() == expectedFieldNames.size()); assertTrue(result.containsAll(expectedFieldNames)); }
4. Заключение
В этом коротком уроке мы хорошо использовали потоковый API Java 8 и экземпляр Introspector – для вызова всех геттеров и получения списка нулевых свойств .
Как обычно, код доступен на GitHub .