首页 > 解决方案 > 获取约束内的所有类

问题描述

我试图制作一个从 SQLite DB 到我的项目逻辑层的通用实例映射器。映射器中的每个条目都是某个类“DAL<name>”的一个实例,例如,DALProduct它们都在同一个包中,扩展DALObject了具有以下结构的类:

public abstract class DALObject{
  abstract String getCreate();
  ... //other logic
}

使用反射,我可以轻松地getCreate在每个类上调用该方法并从中获取我需要的东西。问题是我不知道会有多少子类DALObject,我想要一个在添加新类时不需要触及的映射器。

我知道您可以获得DALObject已加载的 s 的所有子类,但我在加载任何类之前在程序的最开始运行此代码。

有任何想法吗?我有一个很大的约束案例,所以也许我可以以某种方式将它破解。

标签: javareflection

解决方案


只有通过扫描类路径上的每个类(取决于您使用的库的数量,通常很多)并查看它是否扩展了 DALObject,才能完成此类任务。

如果你想走这条路,org.reflections库可以帮助你:

Reflections reflections = new Reflections("my.package",
    Reflector.class.getClassLoader(), new SubTypesScanner(false));
Set<Class<? extends Module>> modules = reflections.getSubTypesOf(DALObject.class);

出于性能原因,我强烈建议您在应用程序启动期间执行一次此扫描并存储结果。

作为一种替代方法(我没有打扰Class这里的泛型类型安全,这是要实现的):

public abstract class DALObject {
    public static List<Class> subTypes = new ArrayList<>();

    public DALObject() {
        DALObject.subTypes.add(this.getClass());
    }
}

显然,这仅在您在某处实例化子类的对象时才有效,如果您getCreate打算首先这样做,我的建议显然行不通。


推荐阅读