我很难使用反射 API 来查找在运行时使用自定义注释进行注释的类。最终目标是找到项目中使用我的自定义 @Job 注释进行注释的所有类,收集它们,并允许它们中的每一个从一个位置运行,而无需手动将它们添加到页面中。但是,我发现让初始搜索正常工作非常困难,因此我无法继续我的项目。
我目前的方法是使用:
Reflections reflections = new Reflections(new ConfigurationBuilder()
.setUrls(ClasspathHelper.forPackage("jobs"))
.setScanners(new TypeAnnotationsScanner())
.filterInputsBy(new FilterBuilder().includePackage("jobs")));
Set<Class<?>> jobs = reflections.getTypesAnnotatedWith(Job.class);
其中“jobs”是包含我正在搜索的所有作业类的包,它将使用自定义 @Job 注释进行注释。“jobs”是我项目中的一个基本包,但我机器上的整体 url 看起来像“.../(project)/app/jobs”。此设置导致搜索一个 url,即“.../(project)/app/”,在配置对象中带有附加过滤器“+jobs.*”。这似乎工作正常,但显然有问题,因为我没有在集合中得到任何类。
如果重要,注释编码为:
package jobs;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Job {
String description();
}
注释类与我正在搜索的作业类位于相同的“作业”包中。包含注释的作业定义示例如下:
package jobs;
@Job(description = "Description of what the job will do")
public class ExampleJob extends MasterJob {...}
我找不到需要更改的内容才能使此搜索按预期运行。感谢您的帮助,如果我能进一步澄清任何事情,请告诉我。
编辑:我认为问题与 Play Framework 如何加载其类有关。幸运的是,框架提供了自己的注解搜索功能,我使用了它。根据评论,我在此处列出的代码将起作用,因为您拥有运行它的所有依赖项。随意使用它作为模板,让我知道它是否也适合你。