Javaその他

Javaのリフレクションを利用してみた(フィールド編)

以前、下記記事にて、Javaのリフレクションについて記載したことがあった。

Javaのリフレクションを利用してみた(メソッド編)リフレクションを利用すると、クラス名・メソッド名・引数を指定して、指定したクラスのメソッドを動的に実行することができるため、メソッド名・...

上記記事では、リフレクションを利用したメソッドの呼び出しについて記載していたが、今回はprivateフィールドの値設定・取得を含むようなサンプルプログラムを作成したので、共有する。

前提条件

下記記事のIntelliJ IDEA Community版をダウンロード済であること。

IntelliJ IDEAをインストールしてみた「IntelliJ IDEA(インテリジェイ アイディア)」という、Eclipseと同等の機能をもつJava用統合開発環境を使って、Sp...

また、下記のように、「demoJava」というJavaプロジェクトを作成済であること。
demoJavaプロジェクト

なお、IntelliJ IDEA上でJavaプロジェクトを作成する方法については、IntelliJ IDEA Community版をダウンロードする記事内の、「IntelliJ IDEA上でのJavaプロジェクトの作成・実行」を参照のこと。

フィールドへのリフレクションを利用したサンプルプログラムの作成と実行

今回作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成

今回は、「CallSampleField.java」で「SampleField.java」の各フィールドの呼び出しを行っている。それぞれのプログラムの内容は以下の通り。

package demo.java;

public class SampleField {

    /**
     * フィールド1
     */
    private String field1 = null;

    /**
     * フィールド2
     */
    private static String field2 = null;

    /**
     * コンストラクタ
     */
    public SampleField(){}

}



package demo.java;

import java.lang.reflect.Field;

public class CallSampleField {

    public static void main(String[] args){
        try{
            //コンストラクタに引数がないクラスのインスタンスを生成
            //Class.forName(クラスのフルパス)でクラスオブジェクトを生成後、
            //getDeclaredConstructor().newInstance()によりインスタンスを生成
            Class clazz = Class.forName("demo.java.SampleField");
            Object obj = clazz.getDeclaredConstructor().newInstance();

            //privateフィールドオブジェクトの取得
            Field field1 = clazz.getDeclaredField("field1");
            //privateフィールドにアクセスできるようにする
            field1.setAccessible(true);

            //privateフィールドに値を設定
            field1.set(obj, "field1 setting");

            //privateフィールドの設定値を取得
            System.out.println("*** SampleField private field getting ***");
            String field1_value = (String)field1.get(obj);
            System.out.println("field1の設定値 : " +field1_value);
            System.out.println();

            //** private staticフィールドも、privateフィールドと同じように
            //** 値の設定・取得ができる

            //private staticフィールドオブジェクトの取得
            Field field2 = clazz.getDeclaredField("field2");
            //privateフィールドにアクセスできるようにする
            field2.setAccessible(true);

            //private staticフィールドに値を設定
            field2.set(obj, "field2 setting");

            //staticフィールドの設定値を取得
            System.out.println("*** SampleField private static field getting ***");
            String field2_value = (String)field2.get(obj);
            System.out.println("field2の設定値 : " +field2_value);

        }catch (Exception e){
            System.out.println(e);
        }
    }
}

さらに、その実行結果は以下の通り。
サンプルプログラムの実行結果

要点まとめ

  • クラスオブジェクトのgetDeclaredFieldメソッドを呼び出し後、set/getメソッドを呼び出すことにより、フィールドへの値設定/値取得が行える。