1. 概要

このクイック記事では、Java 8StreamAPIと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. ゲッターメソッドの呼び出し

Introspectorを使用してCustomerクラスを分析します。 これにより、ターゲットクラスでサポートされているプロパティ、イベント、およびメソッドを簡単に検出できます。

まず、CustomerクラスのすべてのPropertyDescriptorインスタンスを収集します。 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述語は、プロパティを読み取ることができるかどうかをチェックしてゲッターを呼び出し、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
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. 結論

この短いチュートリアルでは、Java 8StreamAPIとIntrospectorインスタンスをうまく利用して、すべてのゲッターを呼び出し、nullプロパティのリストを取得しました

いつものように、コードはGitHubから入手できます。