Top > リフレクション > 変数を書き換える

変数を書き換える

今回は、リフレクションで作成したインスタンスの中に、public で宣言された
変数を探し出して、書き換える方法を説明します。

具体的には、Test1クラスにだけ「public int valueA = 1;」という
変数を作成します。

ReflectTest.java では、リフレクションで作成したインスタンスの
valueA 変数を書き換えてみます。

準備

今回も、3つのファイルを使います。
説明をシンプルにするため、下記の3ファイルを同じフォルダに
作成してください。

  • Test1.java
  • Test2.java
  • ReflectTest.java

Test1.java

Test2.java

ReflectTest.java

実行

まず、コンパイルします。
コンソールを開いて、上記の3ファイルを格納したフォルダに移動します。
次に、「javac *.java 」でコンパイルします。

次に、ReflectTest の main関数に、引数「Test1」を指定して実行します。
コンソールには、「java -cp . ReflectTest Test1」と入力します。
Test1 クラスの valueA変数が書換えられていることが分かります。

では、「java -cp . ReflectTest Test2」と入力して下さい。
Test2 クラスには、valueA変数が無いので、特に変数の書換えは発生していません。

コーディング上の注意点

あるインスタンスのメソッドを求めるには、以下のようにします。

  • そのインスタンスのクラスを取得する( obj.getClass(); )
  • クラスの getDeclaredFields メソッドで、取得したいメソッドを探す

あとは、名前とクラスの型を調べて、Fieldsクラスの set系メソッドで
値を書き込むだけです。

また、読み書き可能な変数は、public で宣言されている必要があります。
これには注意してください。

リフレクションによるメソッド呼び出しのメリット

今回の、リフレクションによる変数呼び出しは、どのような時に
便利なのでしょうか。

管理人としては、基本的に変数は private で宣言すべきと
思っているので、なんとも推奨しがたい手法ですね。

通常の使用シーンよりも、Javaプログラムのデバッガ作成とか、
何らかの監視用途が、使い方としてはベストなのかも知れません。

以上で、今週は終了です。