以前、下記記事にて、Javaのリフレクションについて記載したことがあった。
Javaのリフレクションを利用してみた(メソッド編)リフレクションを利用すると、クラス名・メソッド名・引数を指定して、指定したクラスのメソッドを動的に実行することができるため、メソッド名・...
上記記事では、リフレクションを利用したメソッドの呼び出しについて記載していたが、今回はprivateフィールドの値設定・取得を含むようなサンプルプログラムを作成したので、共有する。
前提条件
下記記事のIntelliJ IDEA Community版をダウンロード済であること。
IntelliJ IDEAをインストールしてみた「IntelliJ IDEA(インテリジェイ アイディア)」という、Eclipseと同等の機能をもつJava用統合開発環境を使って、Sp...
また、下記のように、「demoJava」というJavaプロジェクトを作成済であること。
なお、IntelliJ IDEA上でJavaプロジェクトを作成する方法については、IntelliJ IDEA Community版をダウンロードする記事内の、「IntelliJ IDEA上でのJavaプロジェクトの作成・実行」を参照のこと。
フィールドへのリフレクションを利用したサンプルプログラムの作成と実行
今回は、「CallSampleField.java」で「SampleField.java」の各フィールドの呼び出しを行っている。それぞれのプログラムの内容は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package demo.java; public class SampleField { /** * フィールド1 */ private String field1 = null; /** * フィールド2 */ private static String field2 = null; /** * コンストラクタ */ public SampleField(){} } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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メソッドを呼び出すことにより、フィールドへの値設定/値取得が行える。