gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:36:11 25 4
gpt4 key购买 nike

我有以下代码:

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

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

现在的问题是:

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

提前致谢!

最佳答案

a) 是的,如果您的类位于不同的包中,它应该表现得像那样。正如反射(reflection)中所述 documentation :

Make sure to scan all the transitively relevant packages. For instance, given your class C extends B extends A, and both B and A are located in another package than C, when only the package of C is scanned - then querying for sub types of A returns nothing (transitive), but querying for sub types of B returns C (direct). In that case make sure to scan all relevant packages a priori.

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。

关于Java Reflections getSubTypeOf 不返回层次结构的所有子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42006186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com