javaのreflectionを使用して親クラスまで検索してフィールドを取得する方法

javaで開発している時に、リフレクションを使用してクラスのフィールドを取得するときに少しつまったのでメモ。

  • つまったこと
    • 「親クラスに定義されているフィールドをリフレクションで取ることができなかったこと」。
  • 原因
    • java.lang.ClassのgetDeclaredField(String name) は、親クラスのフィールドまで検索してくれない。
  • 解決策
    • 下記のように、子クラスを検索して見つからなければ、子クラス.getSuperclass() として親クラスを取得して探索。それでも見つからなければ更にその親クラスを探索して・・・、というように再帰的に探索していく。
public Field getFieldFromClass(Class clazz, String fieldName)
            throws NoSuchFieldException {
        Field field = null;
        while (clazz != null) {
            try {
                field = clazz.getDeclaredField(fieldName);
                break;
            } catch (NoSuchFieldException e) {
                clazz = clazz.getSuperclass();
            }
        }

        if (field == null) {
            throw new NoSuchFieldException();
        }
        return field;
    }