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