Java Reflections 获取特定子包的 url



我们正在构建一个测试框架,并使用反射来扫描包中已使用我们定义的注释注释的方法。一切都按预期工作,然而我们遇到了一些我们发现奇怪的东西。

使用 org.reflections.util 中的ClasspathHelper将返回一个Set<URL> ,但它似乎返回了父文件夹的 URL,而不是我们要扫描的实际包的 URL。

例如我们运行ClasspathHelper.forPackage("com.company.project.packageWeWantScanned"),我们将获得一个指向包含所有类的文件夹的 URL,而不是指向该特定包的 URL。例如,在下面的示例文件结构中,我们得到一个指向classes而不是packageWeWantScanned的 URL .

我们如何只扫描我们想要的特定包而不是父文件夹中的所有类?

classes
└── com
    └── company
        └── project
            ├── packageWeWantScanned
            │   ├── SomeClass.class
            │   ├── SomeOtherClass.class
            │   └── SomeOtherClass.class
            └── packageWeDontWantScanned
                ├── DifferentClass.class
                ├── DifferentOtherClass.class
                └── DifferentSomeOtherClass.class

编辑/更新:Sotirios Delimanolis的答案是正确的,但只是为了给那些遇到这个问题的人添加额外的上下文,我们最初使用:

Reflections reflection = new Reflections(ClasspathHelper.forPackage("com.company.project.packageWeWantScanned"), new MethodAnnotationsScanner());

这导致我们得到的比我们想要的更多。

这就是

ClasspathHelper#forPackage(String, ClassLoader..)所做的

有效地从类路径中返回以 [name] 开头的包的 URL。

您可能想使用 Reflections#getMethodsAnnotatedWith(Class) .

Reflections reflections = new Reflections("com.company.project.packageWeWantScanned", new MethodAnnotationsScanner());
System.out.println(reflections.getMethodsAnnotatedWith(SomeAnnotation.class));

相关内容

  • 没有找到相关文章