リフレクションを利用する場合、クラスの型情報を指定する必要がありますが、いちいち指定するのが面倒です。というとで、なかったら再起で呼び出すロジックを組んでみました。コードはこんな感じ。
/**
* プライベート変数に値を設定します。
*
* @param obj インスタンス
* @param fieldName 変数名
* @param value 値
*/
public static void setPrivateField(Object obj, String fieldName,Object value) {
setPrivateField(obj.getClass(), obj, fieldName, value);
}
/**
* プライベートなstatic変数に値を設定します。
* finalな変数はダメです。
*
* @param cls クラス
* @param fieldName 変数名
* @param value 値
*/
public static void setPrivateField(Class<?> cls, String fieldName,
Object value) {
setPrivateField(cls, null, fieldName, value);
}
/**
* プライベートなstatic変数に値を設定します。
* finalな変数はダメです。
*
* @param cls クラス
* @param obj インスタンス
* @param fieldName 変数名
* @param value 値
*/
public static void setPrivateField(Class<?> cls, Object obj, String fieldName, Object value) {
do {
try {
Field field = cls.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(obj, value);
break;
} catch (NoSuchFieldException e) {
// 親クラスからの取得にtry
cls = cls.getSuperclass();
} catch (Exception e) {
// 例外
e.printStackTrace();
break;
}
} while (cls != null);
}
* プライベート変数に値を設定します。
*
* @param obj インスタンス
* @param fieldName 変数名
* @param value 値
*/
public static void setPrivateField(Object obj, String fieldName,Object value) {
setPrivateField(obj.getClass(), obj, fieldName, value);
}
/**
* プライベートなstatic変数に値を設定します。
* finalな変数はダメです。
*
* @param cls クラス
* @param fieldName 変数名
* @param value 値
*/
public static void setPrivateField(Class<?> cls, String fieldName,
Object value) {
setPrivateField(cls, null, fieldName, value);
}
/**
* プライベートなstatic変数に値を設定します。
* finalな変数はダメです。
*
* @param cls クラス
* @param obj インスタンス
* @param fieldName 変数名
* @param value 値
*/
public static void setPrivateField(Class<?> cls, Object obj, String fieldName, Object value) {
do {
try {
Field field = cls.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(obj, value);
break;
} catch (NoSuchFieldException e) {
// 親クラスからの取得にtry
cls = cls.getSuperclass();
} catch (Exception e) {
// 例外
e.printStackTrace();
break;
}
} while (cls != null);
}