Java Reflections getSubTypeOf 不返回层次结构的所有子类

The*_*own 4 java reflection

我有以下代码:

        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());
        }
Run Code Online (Sandbox Code Playgroud)

我希望这会打印扩展 Action 的类的所有类名,以及扩展这些类的所有类,因为它们也间接扩展了 Action。例如 C 扩展 B 扩展 A。如果我做反射.getSubTypesOf(A.class); 它只返回 B 类,但我希望它也返回 C 类。

我怀疑这与 SubTypesScanner 有关系,但调查后我没有发现任何东西可以让它返回 C 类。

现在的问题是:

a) 它应该表现得那样吗?
b) 如果 a 的答案是肯定的,有没有办法返回所有直接和间接扩展类 A 的类?

提前致谢!

小智 5

a) 是的,如果您的类位于不同的包中,它应该表现得如此。如 Reflections文档中所述

确保扫描所有可传递相关的包。例如,假设您的类 C 扩展了 B 扩展了 A,并且 B 和 A 都位于 C 之外的另一个包中,当仅扫描 C 的包时 - 然后查询 A 的子类型不返回任何内容(可传递),但查询B 的子类型返回 C(直接)。在这种情况下,请确保先验扫描所有相关的包。

b) 有多种解决方法可以解决您的问题:

  1. 将 B 和 C 放在同一个包中
  2. 使用 B 和 C 通用的包前缀。例如,如果 B 位于“my.package.b”中,而 C 位于“my.package.c”中,则调用Set<Class<? extends Action>> allClasses = new Reflections("my.package").getSubTypesOf(A.class);将返回 B 和 C。
  3. 明确扫描所有传递相关的包。例如,如果 B 在“my.package.b”中而 C 在“my.package.c”中,则调用Set<Class<? extends Action>> allClasses = new Reflections("my.package.b", "my.package.c").getSubTypesOf(A.class);将同时返回 B 和 C。