Java - 加载带注释的类

时间:2012-08-18 19:17:40

标签: java annotations classloader

我知道在java中加载插件类有很多令人难以置信的工具,但今天我想到了一个想法。

如果我在包“org.home.junk”中注释了一堆带注释和未注释的类(注释带有注释“@AnnotatedClass”),那么这些类的注释方法带有注释“@AnnotatedMethod”。

第一个问题:我可以在运行时获取该特定包中所有类的数组/集合,以便我可以检查哪个类被注释并创建它们的实例。 (我知道如何检查Some.class是否有本指南的注释:http://isagoksu.com/2009/development/java/creating-custom-annotations-and-making-use-of-them/

第二个问题: - 如果我能在第一个问题上做我想做的事 - 最有政治意义的做法是什么?

我相信这是可能的,因为我理解JUnit以类似的方式加载测试用例类。

如果可以用最少的第三方库来完成这样的话会很酷 - 再次 - 如果可能的话:) :( / p>

4 个答案:

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

可以在this SO question

中找到代码使用示例

答案 3 :(得分:1)

这完全取决于您对注释的要求。

例如@EJB:此注释旨在使容器识别并执行EJB特定工作,这需要扫描文件然后查找此类。

但是,如果您的要求只是基于注释启用特定功能,那么您只能使用java反射

e.g。 @NotNull:此注释在JSR 303中设计,用于验证Annotated元素是否为null。可以使用反射API

在运行时轻松实现此功能