java - 获取约束内的所有类
问题描述
我试图制作一个从 SQLite DB 到我的项目逻辑层的通用实例映射器。映射器中的每个条目都是某个类“DAL<name>”的一个实例,例如,DALProduct
它们都在同一个包中,扩展DALObject
了具有以下结构的类:
public abstract class DALObject{
abstract String getCreate();
... //other logic
}
使用反射,我可以轻松地getCreate
在每个类上调用该方法并从中获取我需要的东西。问题是我不知道会有多少子类DALObject
,我想要一个在添加新类时不需要触及的映射器。
我知道您可以获得DALObject
已加载的 s 的所有子类,但我在加载任何类之前在程序的最开始运行此代码。
有任何想法吗?我有一个很大的约束案例,所以也许我可以以某种方式将它破解。
解决方案
只有通过扫描类路径上的每个类(取决于您使用的库的数量,通常很多)并查看它是否扩展了 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
打算首先这样做,我的建议显然行不通。
推荐阅读
- python - python中的这段代码有什么问题
- nuget - 在 VSTS 任务中加载 .ENV 文件
- json - Post json 响应返回 500 错误,而不是使用 python 的 200。请求调用返回 500,而对邮递员的相同调用返回数据
- go - 根据接收者,我如何拥有具有不同返回类型的方法?
- java - 如果报告太长,Jasper 报告图像格式异常
- google-apps-script - 在 Gmail 插件中创建日期选择器小部件
- python - 使用 linregress 的参数中使用的查询迭代分组
- mysql - 如何组合第一和第二选择 SUM 语句
- python - 如何通过 .apply() 在 Lambda 函数上使用 2 个参数
- gnuplot - 标签未显示在 Gnuplot 2D 热图上