Java 入門

ホーム > リフレクション > Class オブジェクトからのインスタンスの作成とメソッド呼出し

Class オブジェクトからのインスタンスの作成とメソッド呼出し

これまでにリフレクション を用いて、実行時にクラスの情報、 オブジェクトの情報を取得する方法、及び、オブジェクトの作成方法について説明しました。

Class オブジェクトからのインスタンスの作成では、 デフォルトコンストラクタを持つクラスのインスタンス化を試みています。

また Employee というクラスにキャストしていました。

ここでは引数をとるコンストラクタをもつクラスのインスタンス化と、さらにそのメソッドを呼び出す方法を説明します。

引数をとるコンストラクタをもつクラスのインスタンス化とメソッド呼出し

実際に呼び出しを行う方法を示します。

まずは次のような Person クラスを用意します。

package com.example.test;

public class Person {

  String name;

  public Person(String name){
    this.name = name;
  }

  public void sayHello(){
    System.out.format("Hello! I'm %s.", name);
  }
}

この Person クラスのオブジェクトを作成し、sayHello メソッドを呼ぶことを考えます。sayHello メソッドは、 コンストラクタで受け取った名前 (name) を使って、Hello, I'm ... に続けて名前を出力します。

package com.example.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class cls1 {

  public static void main(String[] args)
    throws ClassNotFoundException, NoSuchMethodException,
    SecurityException, InstantiationException,
    IllegalAccessException, IllegalArgumentException,
    InvocationTargetException {

    Class<?> cls = Class.forName("com.example.test.Person");
    Constructor<?> cst = cls.getConstructor(String.class);
    Object emp = cst.newInstance("Ichiro");
    Method m = cls.getMethod("sayHello");
    m.invoke(emp, null);

  }
}

ポイントはリフレクションの機能を使って、文字列で渡したクラス名でクラスオブジェクトを作成。 そこから String をひとつ受け取るコンストラクタを取得。それを用いてインスタンス化しています。

クラスが無ければ ClassNotFoundException 例外が、メソッドが無ければ NoSuchMethodException 例外が投げられます。 その他にも、ここではキャッチしていない例外がたくさん投げられる可能性があります。

メソッドが無かった、という事態を防ぐには getMethods や getDeclaredMethods メソッドで指定したメソッド名が存在することを確認してから呼ぶと良いでしょう。

ホーム > リフレクション > Class オブジェクトからのインスタンスの作成とメソッド呼出し