Java Reflections获取特定子包的url

时间:2014-09-17 19:24:43

标签: java reflection

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

使用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());

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

1 个答案:

答案 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));