Java 有什么优雅的方式动态实例化子类吗

2021-11-02 20:29:42 +08:00
 OnlyO

场景 class A 有两个子类:

    class A{
        name="A"
    } 
    下面有两个子类  
    class B extend A{
        name="B"
    }
    class C extend A{
        name="C"
    } 

我想通过一个函数能够动态的实例化子类 B 或者 C 伪代码:

 public A getASubClass(String userInputName)

    for (A a: A.subclassList){
        if(userInputName == a.name){
            return new a();
        }
    }
    throw new Exception();

想实现的效果是后面只需要添加子类,查找子类的方法就不用修改了

2722 次点击
所在节点    Java
24 条回复
CantSee
2021-11-05 11:42:44 +08:00
根据类型获取实例
OnlyO
2021-11-05 15:42:11 +08:00
@CantSee #21 兄弟你给力,不过你这样违法了开闭原则吧,我后期加类型还是要在这里加代码
我用这样的方式实现了
```java
public Type getTypeService(int type) {
Reflections reflections = new Reflections("com.xxxx");
Set<Class<?>> classSet = reflections.getTypesAnnotatedWith(CustomAnnotation.class);
for (Class<?> aClass : classSet) {
CustomAnnotation annotation = aClass.getAnnotation(CustomAnnotation.class);
if (type == CustomAnnotation.type()) {
try {
return (Type) aClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
throw new Exc("msg");
}
}
}
throw new Exc("msg");
}
```
notwaste
2021-11-05 16:46:51 +08:00
我们的做法是在对应的数据库加一个类似 beanName 的字段,下面初始化的时候判断 beanName 字段是否为空,不为空去 getBean beanName
CantSee
2021-11-09 09:01:32 +08:00
@OnlyO 用反射还是比较好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/812542

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX