【Java】privateでstaticなフィールド・メソッドを参照

IT

やったこと

  • privateかつ、staticなフィールドとメソッドを参照したかった
  • やり方を確認したので、サンプルコードを掲載
  • 結論:privateなフィールドとメソッドを参照する方法と全く同じだった
  • この記事からついでに分かること
    • フィールド値の取得はメソッド前後で変わる(メソッドがフィールドを処理する場合)
    • privateなフィールド・メソッドを参照する方法

サンプルコードと結果

  • EditStr.javaではprivateかつstaticなStringとメソッドeditStrを用意
    • editStrはprivateStrの初期値HelloWorld!を足す
  • checkField.javaではEditStr.javaのフィールドとメソッドを参照する
    1. privateでstaticなフィールドprivateStrの値を参照する
      Helloとなっていることを確認
    2. privateでstaticなメソッドeditStr()を呼び出す
    3. もう一度privateStrを参照し、値が変わっていることを確認
      Hello World!となっていることを確認

サンプルコード

今回参照対象のクラス

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は付いていても、付いていなくても、同じ方法で参照が可能

参考

コメント

タイトルとURLをコピーしました