10

如果我有

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
4

1 回答 1

10

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

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

编辑:该文档的后期修订说:

确保扫描所有传递相关的包。例如,假设您的类 C 扩展 B 扩展 A,并且 B 和 A 都位于 C 以外的另一个包中,当仅扫描 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
于 2016-02-23T21:22:58.903 回答