【问题标题】:Java Reflections getSubTypeOf not returning all subclasses of the HierarchyJava反射getSubTypeOf不返回层次结构的所有子类
【发布时间】:2017-02-02 15:30:36
【问题描述】:

我有以下代码:

        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。如果我做反射.getSubTypesOf(A.class);它只返回 B 类,但我希望它也能返回 C 类。

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

现在的问题是:

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

提前致谢!

【问题讨论】:

  • 你从哪里得到Reflections
  • 我认为来自here
  • 这是导入。 import org.reflections.Reflections; 要我查找具体的库吗?
  • 是的亚伦,就是那个。
  • 你一定在某处犯了错误,我刚刚测试过它,它按你预期的那样工作:我有 A > B > C 类,reflections.getSubTypesOf(A.class) 确实产生 B 和 C。是您的所有课程都在同一个包中?看起来这个工具只解析你指定的包

标签: java reflection


【解决方案1】:

a) 是的,如果你的类位于不同的包中,它的行为应该是这样的。如反射documentation中所述:

确保扫描所有传递相关的包。为了 例如,假设您的类 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&lt;Class&lt;? extends Action&gt;&gt; allClasses = new Reflections("my.package").getSubTypesOf(A.class); 将返回 B 和 C。
  3. 明确扫描所有传递相关的包。例如,如果 B 在“my.package.b”中,C 在“my.package.c”中,则调用 Set&lt;Class&lt;? extends Action&gt;&gt; allClasses = new Reflections("my.package.b", "my.package.c").getSubTypesOf(A.class); 将返回 B 和 C。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    相关资源
    最近更新 更多