Java リフレクションの Class オブジェクトからのインスタンスの作成

Class オブジェクトからのインスタンス生成

あるクラスの Class オブジェクトを取得できたらそれを利用して、そのクラスのインスタンスを作成することができます。

インスタンスを作成するにはまず、Class オブジェクトの getDeclaredConstructor() メソッドでコンストラクタオブジェクトを作成します。 そのコンストラクタオブジェクトから、インスタンスを作成するというステップになります。

引数を取らないデフォルトコンストラクタがある場合は、Class オブジェクトの newInstance() メソッドでインスタンスを作ることができます。しかし、この方法は Deprecated です。

引数を受取るコンストラクタオブジェクトを作成してオブジェクトを作成

リフレクションを利用して、以前作成した Employee クラスのインスタンスを作成してみましょう。

Employee クラスのコンストラクタでは String 型のデータを二つ受け取ります。 この場合、Class オブジェクトの getDeclaredConstructor() メソッドを用いて、コンストラクタオブジェクトを作成できます。

getDeclaredConstructor() に渡す型の種類によって、期待するコンストラクタを選択できます。

次のコード例の形 (12行目) で Class オブジェクトから、String を二つ受け取るコンストラクタを作成しています。

package com.keicode.java.test;

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

public class TestApp {

  public static void main(String[] args) {
    try {
      Class<?> c = null;
      c = Class.forName("com.keicode.java.test.Employee");
      Constructor constructor = c.getDeclaredConstructor(String.class, String.class);
      Employee e = (Employee) constructor.newInstance("Ichiro", "Suzuki");
      System.out.println("Last name: " + e.getLastName());
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (InstantiationException e) {
      e.printStackTrace();
    } catch (NoSuchMethodException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    }
  }
}

12行目でコンストラクタオブジェクトを作成し、13行目ではそのコンストラクタオブジェクトの newIntance() メソッドで Employee オブジェクトを作成しています。

コンストラクタの引数は newInstance() メソッドに渡します。

以上、 あるオブジェクトが与えられた場合に、 Class オブジェクトを利用してそのクラスのコンストラクタオブジェクトを作成して、 そのクラスのインスタンスを作成する方法を示しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門