Java Reflections getSubTypeOf不返回层次结构

时间:2017-02-02 15:30:36

标签: 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());
        }

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

我怀疑这与SubTypesScanner有关,但我发现我没有找到任何东西让它返回C类。

现在的问题是:

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

提前致谢!

1 个答案:

答案 0 :(得分:2)

a)是的,如果您的类位于不同的程序包中,则应该具有类似的行为。如《反思documentation》所述:

  

确保扫描所有与传递相关的软件包。对于   例如,假设您的C类扩展了B扩展了A,而B和A都是   当只有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。