Java 動的にクラスロード リフレクション

動的にクラスロードについて調査したのでお勉強メモ
テストコードをまずは、UP

実行環境:JDK 1.8

ソース

動的に生成するクラスの親クラス(抽象クラス)

package xyz._9pg.classLoad.ext;

public abstract class abFooClass {

	private String fooName;

	public abFooClass(String name){
		this.fooName = name;
	};

	public abstract void run();

	public String getFooName() {
		return fooName;
	}

	public void setFooName(String fooName) {
		this.fooName = fooName;
	}
}

動的に生成するクラス

package xyz._9pg.classLoad.ext;

public class barClassA extends abFooClass{

	public barClassA(String name){
		super(name);
	};

    public void run() {
    	System.out.println(getFooName());
    }
}

実行クラス


import java.lang.reflect.Constructor;

import xyz._9pg.classLoad.ext.abFooClass;

public class classLoad {
	public static void main(String[] args) {

    	try {
    		Class<?> cls =  Class.forName("xyz._9pg.classLoad.ext.barClassA");
    		Constructor<?> ctor = cls.getDeclaredConstructor(String.class);
    		abFooClass pc = (abFooClass) ctor.newInstance ("hoge");
    		pc.run();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

実行結果

hoge

解説

肝は、実行クラスの以下の部分

Class<?> cls =  Class.forName("xyz._9pg.classLoad.ext.barClassA");
Constructor<?> ctor = cls.getDeclaredConstructor(String.class);
abFooClass pc = (abFooClass) ctor.newInstance ("hoge");

Class.forNameで、クラスを取得。

getDeclaredConstructorで、コンストラクタを取得しています。

今回に限っては、 getConstructor でもよい。

getConstructor の場合は、不可視なメンバ、メソッドがあるとExceptionが発生するため、getDeclaredConstructorの方が無難なようだ。

getDeclaredConstructor()の引数、はコンストラクタの引数がStringなので、”String.class”と書く。

取得したコンストラクタに対して、newInstance()を行う。

あとは、いつもと同じようにインスタンスに対して、メソッドの実行などが可能。

参考

JavaでReflection 第一回:コンストラクタ編
https://qiita.com/manahirosan/items/32da2cc9f5f03dc454ca

リフレクション コンストラクタが作成できない
https://teratail.com/questions/154984

コメント

タイトルとURLをコピーしました