我有以下代码:
Reflections reflections = new Reflections(packageName, new SubTypesScanner(false));
Set<Class<? extends Action>> allClasses = reflections.getSubTypesOf(Action.class);
for (Class<?> subTypeOfActionInPackageNameClass : allClasses) {
System.out.println(subTypeOfActionInPackageNameClass.getName());
}
我希望这会打印扩展Action的类的所有类名,以及扩展这些类的所有类,因为它们间接地扩展了Action。例如C扩展B扩展A.如果我做Reflections.getSubTypesOf(A.class);它只返回B类,但我希望它也能返回C类。
我怀疑这与SubTypesScanner有关,但我发现我没有找到任何东西让它返回C类。
现在的问题是:
a)它应该表现得那样吗? b)如果a的答案是肯定的,是否有办法返回所有直接和间接扩展A类的类?
提前致谢!
答案 0 :(得分:2)
a)是的,如果您的类位于不同的程序包中,则应该具有类似的行为。如《反思documentation》所述:
确保扫描所有与传递相关的软件包。对于 例如,假设您的C类扩展了B扩展了A,而B和A都是 当只有C的包装是 扫描-然后查询A的子类型不返回任何内容 (传递),但查询B的子类型将返回C(直接)。在 这种情况下,请确保先扫描所有相关软件包。
b)有多种解决方法可以解决您的问题:
Set<Class<? extends Action>> allClasses = new Reflections("my.package").getSubTypesOf(A.class);
将同时返回B和C。Set<Class<? extends Action>> allClasses = new Reflections("my.package.b", "my.package.c").getSubTypesOf(A.class);
将同时返回B和C。