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