为什么不reflect.getSubTypesOf(Object.class)找到枚举?

Cup*_*Tae 9 java reflection enums reflections

如果我有

Reflections reflections = new Reflections("my.package", classLoader, new SubTypesScanner(false));
Run Code Online (Sandbox Code Playgroud)

然后这会找到我的枚举类

Set<Class<? extends Enum>> enums = reflections.getSubTypesOf(Enum.class);
Run Code Online (Sandbox Code Playgroud)

但事实并非如此

Set<Class<?>> classes = reflections.getSubTypesOf(Object.class);
Run Code Online (Sandbox Code Playgroud)

是否有一个原因?


可重复的例子:

package cupawntae;

import org.reflections.Reflections;
import org.reflections.scanners.SubTypesScanner;

public class Reflector {
    public static void main(String[] args) {
        Reflections reflections = new Reflections("cupawntae", Reflector.class.getClassLoader(), new SubTypesScanner(false));
        System.out.println("Objects: " + reflections.getSubTypesOf(Object.class));
        System.out.println("Enums: " + reflections.getSubTypesOf(Enum.class));
        System.out.println("Enum's superclass: " + Enum.class.getSuperclass());
    }
}
Run Code Online (Sandbox Code Playgroud)

枚举类:

package cupawntae;

public enum MyEnum {
}
Run Code Online (Sandbox Code Playgroud)

输出:

Objects: [class cupawntae.Reflector]
Enums: [class cupawntae.MyEnum]
Enum's superclass: class java.lang.Object
Run Code Online (Sandbox Code Playgroud)

Cup*_*Tae 8

这实际上是记录在案的行为,尽管它可能不是特别清楚或直观:

请注意,在使用构造函数时new Reflections("my.package"),只会my.package扫描带有前缀' '的网址,并且不会扫描其他网址中的任何传递类(例如,如果my.package.SomeClass延伸my.package.SomeClass,则不会扫描后者).在这种情况下,使用其他构造函数并指定相关的包/ URL

编辑:该文档的后续版本说:

确保扫描所有与传递相关的包.例如,给定你的类C扩展B扩展A,并且当只扫描C的包时,B和A都位于除C之外的另一个包中 - 然后查询A的子类型什么都不返回(传递),但是查询B的子类型返回C(直接).在这种情况下,请确保先验扫描所有相关的包.

在这种情况下,other.package.OtherClass计为传递类(如java.lang.Enum),因此不包括在扫描中,这意味着other.package.OtherClass不包括子类.

同样,如果我们Enum在问题的例子中做出扩展目标包之外的东西,例如

public class Reflector extends Exception {
Run Code Online (Sandbox Code Playgroud)

然后在扫描中找不到该类

Objects: []
Enums: [class cupawntae.MyEnum]
Enum's superclass: class java.lang.Object
Run Code Online (Sandbox Code Playgroud)

  • 哇,这太可怕了。因此,如果你有一个扩展 `AbstractList` 的专门类,或者你自己的异常,如你所展示的,那么 `reflections.getAllTypes()` 将找不到它。真是一团糟。即使这是有意的,也应该以某种方式进行更改。至少它应该自动遍历 java.lang 和 java.util! (2认同)
  • 哦,我的上帝。即使您专门包含“ java.lang”和“ java.util”作为包,“ reflections.getAllTypes()”和“ reflections.getSubTypesOf(Object.class)”都不会为您提供专门的Exception / LIst。因此,无法使用此库获取所有类,是吗?多可惜。 (2认同)
  • Juan Garcia,如果你看到这个,感谢编辑.事实上,你找到的那个是更新的,并且已经略微改写(不确定它是否反映了(没有双关语意)行为改变,没有详细阅读).无论如何,我只是尝试将"10"更改为"9",因为它会找到我引用的版本,你知道什么?在那!干杯 (2认同)