O/Rマッピングを自作するような奇特な方とか、他社のソースで手を出せない方とか?
・・・この例は、ちょっとひどいかw
ま、それはともかく、インスタンス変数にアクセスしたいときはあるものです。
これを知ってると、情緒不安定から抜け出せるかもしれません。
乱用すると他の人が泣くので、ご利用は計画的にw
private変数に値をセットするサンプル
RefFieldTestのインスタンス変数であるstr1~str3に、リフレクションを使って値をセットします。
セット後、確認のため、標準出力を行います。
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 | import java.lang.reflect.Field; public class RefFieldTest { private String str1 = null; private String str2 = null; private String str3 = null; public static void main(String[] args) { try { Class clazz = (Class)Class.forName("RefFieldTest"); //RefFieldTestのインスタンスを作成 RefFieldTest obj = (RefFieldTest)clazz.getDeclaredConstructor().newInstance(); //作成したインスタンスのフィールドに値をセット setFieldValue(clazz,obj,"str1","ロン!"); setFieldValue(clazz,obj,"str2","小三元 混一色 白 中 対々和 三暗刻 ドラ3"); setFieldValue(clazz,obj,"str3","\(^o^)/オワタ"); //セットしたフィールド値を出力 System.out.println("str1:" + obj.str1); System.out.println("str2:" + obj.str2); System.out.println("str3:" + obj.str3); } catch (Exception e) { e.printStackTrace(); } } public static void setFieldValue(Class clazz,RefFieldTest obj,String filedName,String fieldValue) throws Exception { Field field = clazz.getDeclaredField(filedName); field.set(obj, fieldValue); } } |
実行結果
1 2 3 | str1:ロン! str2:小三元 混一色 白 中 対々和 三暗刻 ドラ3 str3:\(^o^)/オワタ |
サンプルの解説
Class#getDeclaredConstructor()#newInstance()にて、目的のインスタンスを生成することができます。
もちろん、コンストラクタに引数がある場合、値をセットすることが可能です。
インスタンスを生成後は、フィールドに値を詰め込むわけですが、こちらは、Field#set(Object,Object)で簡単にできちゃいます。
この例では自身のクラス内のprivate変数なので面白くないですが、他クラスのprivate変数でも同様に可能です。
そんなときは、フィールド値にアクセスする前に、Field#setAccessible(boolean)を呼び出しましょう。
リフレクションで値を取得するには・・・?
リフレクションで値を取得する方法は、こちらを見てください。