Top > リフレクション > メソッドを呼び出す

メソッドを呼び出す

前回は、ソース内にそのクラス名を書かずに、クラスのインスタンスを作成する
方法を紹介しました。

今回紹介するリフレクションの技法は、「メソッドを呼び出す」
という技です。

具体的には、Test1クラスにだけ「public void calculate( int a, int b );」という
メソッドを作成します。

ReflectTest.java では、リフレクションで作成したインスタンスの
calculateメソッドを呼び出してみることにします。

準備

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

では、「java -cp . ReflectTest Test2」と入力して下さい。
Test2 クラスには、calculate メソッドが無いので、NoSuchMethodException
の例外が発生しています。

コーディング上の注意点

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

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

このとき、取得したいメソッドの引数のクラスを配列にして
getDeclaredMethod を呼び出しますが、引数が int , boolean などの
プリミティブ型の場合、そのクラスは、int.class などいう、見慣れぬ表現を
使用します。
普通のオブジェクトであれば、Integer.class などと書くところです。

また、取得可能なメソッドは、public で宣言されている必要があります。
これも要注意ポイントです。

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

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

管理人は、public で宣言したメソッドなら、何でも呼び出せるという
ところに意義があると思います。
本来なら、色々なソースをかき集めてシステムを作る場合、メソッドは共通のn
場合は、Javaの インタフェースを implements すべきですが、事情により
メソッド名は同じでも、インタフェースでまとめられない場合もあります。

そのような場合に、今回のメソッド呼び出しを使うと、メソッドの 名前と引数さえ分かっていれば、確実に呼び出すことが可能です。

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