動的にクラスロードについて調査したのでお勉強メモ
テストコードをまずは、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
コメント