スーパークラスのサブクラスであるクラスのレジストリを作成したいと思います。クラスはレジストリとして機能するマップに格納されます。キーはレジストリからキーが選択され、そのクラスのインスタンスはリフレクションによって作成されます。スーパークラスからコンストラクタを使用してサブクラスのインスタンスを作成する方法
スーパークラスのコンストラクタ(1パラメータ付き)に応じてクラスをインスタンス化したいと思います。それは、サブクラスでコンストラクタを宣言した場合にのみ機能します。
スーパークラスのコンストラクタを使用してクラスをインスタンス化する方法はありますか?そのコードを型安全にする方法はありますか?
例コード:
public class ReflectionTest {
/**
* Base class with no-args constructor and another constructor with 1 parameter
*/
public static class BaseClass {
Object object;
public BaseClass() {
System.out.println("Constructor with no args");
}
public BaseClass(Object object) {
this.object = object;
System.out.println("Constructor with parameter= " + object);
}
public String toString() {
return "Object = " + object;
}
}
/**
* Subclass with 1 parameter constructor
*/
public static class SubClass1 extends BaseClass {
public SubClass1(Object object) {
super(object);
}
}
/**
* Subclass with no-args constructor
*/
public static class SubClass2 extends BaseClass {
}
public static void main(String[] args) {
// registry for classes
Map<Integer,Class<?>> registry = new HashMap<>();
registry.put(0, SubClass1.class);
registry.put(1, SubClass2.class);
// iterate through classes and create instances
for(Integer key: registry.keySet()) {
// get class from registry
Class<?> clazz = registry.get(key);
try {
// get constructor with parameter
Constructor constructor = clazz.getDeclaredConstructor(Object.class);
// instantiate class
BaseClass instance = (BaseClass) constructor.newInstance(key);
// logging
System.out.println("Instance for key " + key + ", " + instance);
} catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
}
System.exit(0);
}
}
例では、次のコンソール出力を与える:
Constructor with parameter= 0
Instance for key 0, Object = 0
java.lang.NoSuchMethodException: swing.table.ReflectionTest$SubClass2.<init>(java.lang.Object)
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.getConstructor(Class.java:1825)
at swing.table.ReflectionTest.main(ReflectionTest.java:63)
特定のサブクラスに0コンストラクタと1引数コンストラクタの両方があった場合はどうしますか? –