javaのreflectionを使用して親クラスまで検索してフィールドを取得する方法
javaで開発している時に、リフレクションを使用してクラスのフィールドを取得するときに少しつまったのでメモ。
- つまったこと
- 「親クラスに定義されているフィールドをリフレクションで取ることができなかったこと」。
- 原因
- java.lang.Class
のgetDeclaredField(String name) は、親クラスのフィールドまで検索してくれない。
- java.lang.Class
- 解決策
- 下記のように、子クラスを検索して見つからなければ、子クラス.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; }