リフレクションを利用する場合、クラスの型情報を指定する必要がありますが、いちいち指定するのが面倒です。というとで、なかったら再起で呼び出すロジックを組んでみました。コードはこんな感じ。
/**
* プライベート変数の値を取得します。
*
* @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;
}
* プライベート変数の値を取得します。
*
* @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 件のコメント:
コメントを投稿