为什么没有反射.getSubTypesOf(Object.class)找到枚举?

时间:2016-02-23 18:07:15

标签: java reflection enums google-reflections

如果我有

Reflections reflections = new Reflections("my.package", classLoader, new SubTypesScanner(false));

然后这会找到我的枚举类

Set<Class<? extends Enum>> enums = reflections.getSubTypesOf(Enum.class);

但这并不是

Set<Class<?>> classes = reflections.getSubTypesOf(Object.class);

这是否有原因?

可重复的例子:

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

枚举类:

package cupawntae;

public enum MyEnum {
}

输出:

Objects: [class cupawntae.Reflector]
Enums: [class cupawntae.MyEnum]
Enum's superclass: class java.lang.Object

1 个答案:

答案 0 :(得分:7)

这实际上是documented behaviour,虽然它可能不是特别清楚或直观:

  

请注意,在使用构造函数new Reflections("my.package")时,只会扫描前缀为“my.package”的网址,并且不会扫描其他网址中的任何传递类(例如,如果my.package。 SomeClass扩展other.package.OtherClass,而后者不会被扫描)。在这种情况下,使用其他构造函数并指定相关的包/ URL

编辑:该文档的later revision说:

  

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

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

同样,如果我们在问题的示例中使Reflections扩展目标包之外的内容,例如

public class Reflector extends Exception {

然后在扫描中找不到该类

Objects: []
Enums: [class cupawntae.MyEnum]
Enum's superclass: class java.lang.Object