Java - 加载带注释的类

25
我知道Java有许多令人惊叹的工具用于加载插件类,但今天我有一个想法。假设我有一堆注释和未注释的类在包“org.home.junk”中(用注释“@AnnotatedClass”进行注释),这些类有带注释方法,比如说,用注释“@AnnotatedMethod”进行注释。
第一个问题:我能否在运行时获取该特定包中所有类的数组/集合,以便我可以检查哪些类被注释并创建它们的实例。(我知道如何检查Some.class是否有注释,参考此指南:http://isagoksu.com/2009/development/java/creating-custom-annotations-and-making-use-of-them/
第二个问题:如果我可以做到第一个问题中想要的,那么最政治正确的方法是什么?
我相信这是可能的,因为我了解JUnit以某种类似的方式加载测试用例类。
如果可能,最好使用最少的第三方库等。
4个回答

31

第一个回答:看看这个项目

Reflections reflections = new Reflections("org.home.junk");
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(javax.persistence.Entity.class);

它返回所有标注有javax.persistence.Entity注解的org.home.junk类。

第二个答案:要创建上述类的新实例,您可以这样做。

for (Class<?> clazz : annotated) {
    final Object newInstance = clazz.newInstance();
}
希望这个回答解决了您的问题。

1
终于在搜索了三天之后得到了一个合适的答案。感谢@Kowser和@Xeperis。 - Niravdas

2

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

1

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

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

但是,如果您的要求仅是基于注释启用特定功能,则只能使用Java反射来实现它。

例如,@NotNull:此注释设计为在JSR 303中验证已注释元素不为空。可以使用反射API在运行时轻松实现此功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接