【8/31まで 今季最大のセール開催中!】Udemyの人気コースが今なら1,200円から!!

【Java入門】リフレクションでprivateフィールドの値を取得する方法

【Java入門】リフレクションでprivateフィールドの値を取得する方法

この記事では、以下のProductクラスが持つ、fieldStr,fieldValフィールドにリフレクションを使ってアクセスする方法をまとめています。

Product.java

public class Product {

    private String fieldStr = "ハローワールド";
    private int fieldVal = 100;

    private void Twice(){
        this.fieldVal = fieldVal * 2;
    }
}

任意のprivateフィールドの値を取得する方法

任意のprivate変数の値を取得するにはgetDeclaredField("fieldName");を使用し、引数に取得したいフィールド名を指定します。

ProductTest.java

//インスタンスを取得。
Product obj = new Product();

//フィールドを取得。
Field field = Product.class.getDeclaredField("fieldStr");

//フィールドにアクセスできるようにする。
field.setAccessible(true);

//フィールド名(変数名)を出力。
System.out.println("変数名:" + field.getName());

//フィールドの値を出力。
System.out.println("値:" + field.get(obj));

実行結果

変数名:filedStr
値:ハローワールド

任意のメソッドで値を書き換えられたprivateフィールドを取得する。

ProductTest.java

//インスタンスを取得。
Product obj = new Product();

//フィールドを取得。
Field field = Product.class.getDeclaredField("fieldVal");

//フィールドにアクセスできるようにする。
field.setAccessible(true);

//フィールドの値を出力。
System.out.println("メソッド実行前:" + field.get(obj));

//メソッドを取得。
Method method = Product.class.getDeclaredMethod("Twice");

//メソッドにアクセスできるようにする。
method.setAccessible(true);

//メソッド実行
method.invoke(obj);

//フィールドの値を出力。
System.out.println("メソッド実行後:" + field.get(obj));

実行結果

メソッド実行前:100
メソッド実行後:200

解説

Twice()メソッドを実行して2倍された`fieldVal`フィールドの値を取得することができました。

クラス内の全フィールドを取得する

クラス内の全フィールドを取得するにはgetDeclaredFields()を使用します。
但し、スーパークラスから継承されているフィールドを取得することはできません。

ProductTest.java

//インスタンスを取得。
Product obj = new Product();

//フィールドを取得。
Field[] fields = Product.class.getDeclaredFields();

//すべてのフィールド名と値を出力する。
for(Field field : fields){

    //フィールドにアクセスできるようにする。
    field.setAccessible(true);

    //フィールド名(変数名)を出力。
    System.out.println("変数名:" + field.getName());

    //フィールドの値を出力。
    System.out.println("値:" + field.get(obj));
}

実行結果

変数名:fieldStr
値:ハローワールド
変数名:fieldVal
値:100

以上で記事の解説はお終い!

もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!

2 COMMENTS

【Java】privateでstaticなフィールド・メソッドを参照 | アンディノーツ へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です