import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;
// 基类
public abstract class Base {
private static final Map<String, Class<? extends Base>> registry = new HashMap<>();
// 静态方法,用于注册子类
public static void register(String key, Class<? extends Base> clazz) {
registry.put(key, clazz);
}
// 静态方法,根据key获取并实例化子类
public static Base getInstance(String key) throws Exception {
Class<? extends Base> clazz = registry.get(key);
if (clazz == null) {
throw new IllegalArgumentException("No class registered with key: " + key);
}
// 使用无参构造器创建实例
Constructor<? extends Base> constructor = clazz.getDeclaredConstructor();
constructor.setAccessible(true); // 如果构造器不是public的,需要设置为可访问
return constructor.newInstance();
}
// 基类的方法,子类可以覆盖
public void doSomething() {
System.out.println("Doing something in Base class");
}
}
// 子类A
public class SubA extends Base {
static {
Base.register("SubA", SubA.class);
}
@Override
public void doSomething() {
System.out.println("Doing something in SubA");
}
}
// 子类B
public class SubB extends Base {
static {
Base.register("SubB", SubB.class);
}
@Override
public void doSomething() {
System.out.println("Doing something in SubB");
}
}
// 主类
public class Main {
public static void main(String[] args) {
try {
// 根据key获取并调用子类方法
Base subA = Base.getInstance("SubA");
subA.doSomething(); // 输出 "Doing something in SubA"
Base subB = Base.getInstance("SubB");
subB.doSomething(); // 输出 "Doing something in SubB"
} catch (Exception e) {
e.printStackTrace();
}
}
}
根据不同类型。进入子类
最新推荐文章于 2025-12-13 12:19:21 发布
206

被折叠的 条评论
为什么被折叠?



