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