Java 入門

ホーム > リフレクション > リフレクション ~ Class オブジェクトからのインスタンスの作成

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

リフレクション及び Class クラスについては リフレクション ~ Class クラス をみてください。

ここではクラス名が分かった場合に、その名前からそのクラスのインスタンス (オブジェクト) を作ります。

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

Class オブジェクトを取得したら newInstance を呼び出すことで、その Class オブジェクトが型情報を保持するクラスのインスタンスを作ることができます。

以前の例では、 "com.keicode.java.test.Employee" という文字列から、 この Employee クラスの Class オブジェクトを取得できました。 このオブジェクトの newInstance メソッドを呼ぶことで、 Employee クラスのインスタンス (Employee オブジェクト) を作りましょう。

newInstance メソッドは失敗した場合に IllegalAccessException 例外または InstantiationException 例外を投げますので、 newInstance メソッドを呼ぶ箇所は try-catch ブロックで囲みます。

この newInstance メソッドはデフォルトコンストラクタを呼びます。デフォルトコンストラクタというのは、引数を持たないコンストラクタのことです。 従って、newInstance メソッドを用いてデフォルトコンストラクタを持たないクラスのインスタンス化を試みても失敗します。

ここでは、 Employee クラスではデフォルトコンストラクタは実装していないので、次のコードは失敗します。

Class<?> c;
c = Class.forName("com.keicode.java.test.Employee");
Employee e = (Employee) c.newInstance();

実行結果

java.lang.InstantiationException: ...Employee
  at java.lang.Class.newInstance0(Class.java..)
  at java.lang.Class.newInstance(Class.java..)
  ...

そこで、 Employee クラスにデフォルトコンストラクタを実装します。

package com.keicode.java.test;

public class Employee {
    
    String fname;
    String lname;
    
    public Employee(){
    }
    ...

すると、問題なく Employee オブジェクトが作成できました。

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

ホーム > リフレクション > リフレクション ~ Class オブジェクトからのインスタンスの作成