やったこと
- privateかつ、staticなフィールドとメソッドを参照したかった
- やり方を確認したので、サンプルコードを掲載
- 結論:privateなフィールドとメソッドを参照する方法と全く同じだった
- この記事からついでに分かること
- フィールド値の取得はメソッド前後で変わる(メソッドがフィールドを処理する場合)
- privateなフィールド・メソッドを参照する方法
サンプルコードと結果
EditStr.java
ではprivateかつstaticなStringとメソッドeditStr
を用意editStr
はprivateStrの初期値Hello
にWorld!
を足す
checkField.java
ではEditStr.java
のフィールドとメソッドを参照する- privateでstaticなフィールド
privateStr
の値を参照する
→Hello
となっていることを確認 - privateでstaticなメソッド
editStr()
を呼び出す - もう一度
privateStr
を参照し、値が変わっていることを確認
→Hello World!
となっていることを確認
- privateでstaticなフィールド
サンプルコード
今回参照対象のクラス
public class EditStr {
// staticを取っても結果は同じ
private static String privateStr = "Hello";
// staticを取っても結果は同じ
private static void editStr(){
privateStr = privateStr + " World!";
}
}
参照するクラス
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class checkField {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
EditStr es = new EditStr();
// フィールドを取得
Field testField = EditStr.class.getDeclaredField("privateStr");
// フィールドにアクセスできるようにする
testField.setAccessible(true);
// フィールド値を取得
Object testStrBefore = testField.get(es);
// 値を確認
System.out.println("処理前:" + testStrBefore);
// メソッドを取得
Method method = EditStr.class.getDeclaredMethod("editStr");
// メソッドにアクセスできるようにする
method.setAccessible(true);
// メソッド実行
method.invoke(es);
// フィールド値を再度取得
Object testStrAfter = testField.get(es);
// 値をもう一度確認
System.out.println("処理後:" + testStrAfter);
}
}
実行結果
- 実行結果が処理前と処理後が意図通り変化していることを確認
その他気づいた点
- メソッド呼び出し後のフィールド値は、メソッド参照後にフィールド値を再度取得する処理をしないと値は変わらない
static
は付いていても、付いていなくても、同じ方法で参照が可能
コメント