答案似乎很明显:
(new Reflections("package")).getSubTypesOf(SuperClass.class)
但是,如果层次结构被分成几个包,则此构造不会找到所有后继者。
有以下类别:
package1.ParentClass extemds SuperClass
package2.ChildClass extends ParentClass
包package1而不package2嵌套。
设计
(new Reflections("package1")).getSubTypesOf(SuperClass.class)
预计返回package1.ParentClass
这是建筑
(new Reflections("package2")).getSubTypesOf(SuperClass.class)
我们package2.ChildClass的不会回来,虽然这是明显的继承人SuperClass。
我明白。我可以手动检查包的所有类并收集必要的类。但是没有标准的方法吗?
然而,解释为什么默认ChildClass不是?对我来说,这是一个非常出乎意料的行为org.reflections.Reflections。
UPD:我研究了 org.reflections 内核的源代码,一切都井井有条。简而言之,这就是 java 实现 Reflections 的方式。反射中的每个类都只有对父类的引用。因此,无论如何搜索子类都是矫枉过正的。为什么在此枚举中没有来自其他包的超类是一个单独的问题。如此实施。
对于每个特定任务,您需要使用最佳解决方案。但我想听听有关允许您找到所有后代的现有解决方案,java org.reflections 除外。
UPD:另一种有趣且简单的方法。
Reflections reflections = new Reflections("package1", new SubTypesScanner())
Set<Class<?>> subTypes = new HashSet<>();
for (String className : reflections.getStore().get(SubTypesScanner.class.getSimpleName()).values()) {
try {
Class subType = Class.forName(className);
if (SuperClass.class.isAssignableFrom(subType)) {
subTypes.add(subType);
}
} catch (ClassNotFoundException e) {
throw new RuntimeException("Этого не может быть:)", e);
}
}
return subTypes;
此解决方案遍历包的所有类(对象的后代除外)
reflections.getStore().get(SubTypesScanner.class.getSimpleName()).values()
并检查它们是否继承自或实现 SuperClass
SuperClass.class.isAssignableFrom(subType)
性能至少比搜索所有包然后过滤更好
原因是该类
ChildClass不是 的直接后代SuperClass,而是通过该类ParentClass。Reflections不会递归检查“父-父母”等,因此要检测通过“中间”类继承的事实,有必要加载包含所有“中间”类的包。在这种情况下,为了确定继承ChildClass自的事实SuperClass,您还必须加载ParentClass. 结果集 (Set) 中的额外类可以按包名称进行过滤。1) 如果包“package1”未知,则可以从所有包中加载实现,然后按所需包“package2”进行过滤:
或者
2) 作为一种更高效的替代方法,您可以使用标准的“java 核心”工具并获取包的所有类文件并递归检查它们是否存在所需的后继者。