我们正在构建一个测试框架,并使用反射来扫描包中已经使用我们定义的注释进行注释的方法。 一切都像预期的那样工作, 然而, 我们遇到了一些我们发现很奇怪的东西。
使用ClasspathHelper
中的org.reflections.util
将返回Set<URL>
,
但它似乎是返回父文件夹的URL而不是我们想要扫描的实际包的URL。
例如,
我们运行ClasspathHelper.forPackage("com.company.project.packageWeWantScanned")
,
我们将获得一个指向包含所有类的文件夹的URL,而不是指向该特定包的文件夹。
例如,在下面的示例文件结构中,
我们得到一个指向classes
的网址,而不是packageWeWantScanned
。
我们如何只扫描我们想要的特定包而不是父文件夹中的所有类?
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());
这导致我们得到的比我们想要的更多。
答案 0 :(得分:2)
ClasspathHelper#forPackage(String, ClassLoader..)
做什么
使用以[name]
开头的包从classpath中有效地返回url
您可能想要使用Reflections#getMethodsAnnotatedWith(Class)
。
Reflections reflections = new Reflections("com.company.project.packageWeWantScanned", new MethodAnnotationsScanner());
System.out.println(reflections.getMethodsAnnotatedWith(SomeAnnotation.class));