我知道在java中加载插件类有很多令人难以置信的工具,但今天我想到了一个想法。
如果我在包“org.home.junk”中注释了一堆带注释和未注释的类(注释带有注释“@AnnotatedClass”),那么这些类的注释方法带有注释“@AnnotatedMethod”。
第一个问题:我可以在运行时获取该特定包中所有类的数组/集合,以便我可以检查哪个类被注释并创建它们的实例。 (我知道如何检查Some.class是否有本指南的注释:http://isagoksu.com/2009/development/java/creating-custom-annotations-and-making-use-of-them/)
第二个问题: - 如果我能在第一个问题上做我想做的事 - 最有政治意义的做法是什么?
我相信这是可能的,因为我理解JUnit以类似的方式加载测试用例类。
如果可以用最少的第三方库来完成这样的话会很酷 - 再次 - 如果可能的话:) :( / p>
答案 0 :(得分:25)
第一个回答:请查看this project。
Reflections reflections = new Reflections("org.home.junk");
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(javax.persistence.Entity.class);
它返回org.home.junk
注释javax.persistence.Entity
注释的所有类。
第二回答:要创建上述类的新实例,您可以执行此操作
for (Class<?> clazz : annotated) {
final Object newInstance = clazz.newInstance();
}
希望这能解决所有问题。
答案 1 :(得分:2)
可以使用检查文件系统的技术来完成它,因为它更像是一个类加载器问题而不是反射问题。检查一下:Can you find all classes in a package using reflection?。
如果可以检查目录中存在的所有类文件,则可以使用此方法轻松获取相应的类
Class<?> klass = Class.forName(className)
要知道某个类是否注释是一个反映问题。获取类中使用的注释是这样完成的:
Annotation[] annotations = klass.getAnnotations();
请务必定义自定义注释,并在运行时显示保留策略类型。
@Retention(RetentionPolicy.RUNTIME)
本文是一个很好的资源,可以获得更多信息:http://tutorials.jenkov.com/java-reflection/annotations.html。
答案 2 :(得分:1)
如果您有春季(第三方,抱歉:-)),请使用org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider
中找到代码使用示例答案 3 :(得分:1)
这完全取决于您对注释的要求。
例如@EJB
:此注释旨在使容器识别并执行EJB特定工作,这需要扫描文件然后查找此类。
但是,如果您的要求只是基于注释启用特定功能,那么您只能使用java反射
e.g。 @NotNull
:此注释在JSR 303中设计,用于验证Annotated元素是否为null。可以使用反射API