nullを返すすべてのゲッターを見つける方法

ヌルを返すすべてのゲッターを見つける方法

1. 概要

この簡単な記事では、Java 8 Stream APIと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 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 result = Utils.getNullPropertiesList(customer);
    List expectedFieldNames = Arrays
      .asList("emailId","phoneNumber");

    assertTrue(result.size() == expectedFieldNames.size());
    assertTrue(result.containsAll(expectedFieldNames));
}

4. 結論

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

いつものように、コードはover on GitHubで利用できます。