Top > リフレクション > コンストラクタ

コンストラクタを呼び出す

初心者の方には、あまり聞きなれないリフレクションという手法を
紹介していきます。

今回紹介するリフレクションの技法は、「クラス名を指定してインスタンスを作る」
という技です。

それって、「Test1 test1 = new Test1()」のことじゃないの?
と思った方、非常に正常な感覚の持ち主です。

今回紹介する方法も、基本的には同じことをするのですが、Test1クラスを
呼び出すか、Test2 クラスを呼び出すかを、main()関数の引数に渡そうと思います。
とりあえず、記事の通りに読みすすめてください。

準備

今回は、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 クラスの toString() メソッドが呼び出されていることが分かります。

では、「java -cp . ReflectTest Test2」と入力して下さい。
Test2 クラスの toString() メソッドが呼び出されていることが分かりますね。

リフレクションのメリット

さて、リフレクションというのは、どういう時に使うと便利でしょうか。
実は、今回の例を応用すると、Test3 や Test4 をどんどん追加していっても、
ReflectTestクラスは、修正しなくて良いのです。

リフレクションを使わずに、ReflectTestクラスを 引数で、if文を使って
「Ojbect obj = new Test1()」と「Ojbect obj = new Test2()」を呼び出して
いたら、Test3 とか、Test4 が増えると、if文を追加していくことになって
しまうところです。

つまり、既存の、テストが終わったソースコードを修正することなく、新しい
クラスを、システムに追加することができるので、システムの拡張が簡単に実施
できるというメリットがあります。

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