2011年1月26日水曜日

[Java]プライベートフィールドの値を取得する

privateなフィールドをコードを修正せずに取得しようとした場合、publicなアクセッサメソッドを呼び出すか、リフレクションを利用するしかありません。
リフレクションを利用する場合、クラスの型情報を指定する必要がありますが、いちいち指定するのが面倒です。というとで、なかったら再起で呼び出すロジックを組んでみました。コードはこんな感じ。

/**
 * プライベート変数の値を取得します。
 *
 * @param obj インスタンス
 * @param fieldName 変数名
 * @return 値
 */

public static Object getPrivateField(Object obj, String fieldName) {
    Object result = getPrivateField(obj.getClass(), obj, fieldName);
    return result;
}

/**
 * プライベートなstatic変数の値を取得します。
 *
 * @param cls クラス
 * @param fieldName 変数名
 * @return 値
 */

public static Object getPrivateField(Class<?> cls, String fieldName) {
    Object result = getPrivateField(cls, null, fieldName);
    return result;
}

/**
 * プライベート変数の値を取得します。
 *
 * @param cls クラス
 * @param obj インスタンス
 * @param fieldName 変数名
 * @return 値
 */

public static Object getPrivateField(Class<?> cls, Object obj,
        String fieldName) {
    Object result = null;

    do {
        try {
            Field field = cls.getDeclaredField(fieldName);
            field.setAccessible(true);
            result = field.get(obj);
            break;
        } catch (NoSuchFieldException e) {
            //親クラスからの取得にtry
            cls = cls.getSuperclass();
        } catch (Exception e) {
            //例外
            e.printStackTrace();
            break;
        }
    } while (cls != null);

    return result;
}

0 件のコメント: