当前位置:  开发笔记 > 编程语言 > 正文

在运行时扫描Java注释

如何解决《在运行时扫描Java注释》经验,为你挑选了7个好方法。

搜索带注释类的整个类路径的最佳方法是什么?

我正在做一个库,我想允许用户注释他们的类,所以当Web应用程序启动时,我需要扫描整个类路径以获取某些注释.

你知道一个库或Java工具吗?

编辑:我正在考虑类似Java EE 5 Web服务或EJB的新功能.您使用@WebServiceor 注释您的类,@EJB并且系统在加载时查找这些类,以便远程访问它们.



1> Arthur Ronal..:

使用org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider

API

从基础包扫描类路径的组件提供程序.然后,它会对结果类应用排除和包含过滤器以查找候选项.

ClassPathScanningCandidateComponentProvider scanner =
new ClassPathScanningCandidateComponentProvider();

scanner.addIncludeFilter(new AnnotationTypeFilter(.class));

for (BeanDefinition bd : scanner.findCandidateComponents())
    System.out.println(bd.getBeanClassName());


@Javatar使用Java的反射API. .class.getFields()对于每个字段,调用getAnnotation()
谢谢你告诉我这件事.您是否也知道如何扫描其路径具有自定义注释的类的类路径?
@Max试试这个:`Class <?> cl = Class.forName(beanDef.getBeanClassName());`http://farenda.com/spring/find-annotated-classes/

2> Jonathan..:

另一个解决方案是谷歌的反思.

快速复审:

如果你使用Spring,Spring解决方案就是你的选择.否则这是一个很大的依赖.

直接使用ASM有点麻烦.

直接使用Java Assist也很笨拙.

Annovention超轻便,方便.还没有maven集成.

谷歌的反思吸引了谷歌的收藏.索引一切然后超快.


`new Reflections("my.package").getTypesAnnotatedWith(MyAnnotation.class)`.呐喊
我需要指定包装名称吗?通配符?对于classpath中的所有类呢?

3> Luke Hutchis..:

您可以使用ClassGraph查找具有任何给定注释的类,以及搜索其他感兴趣的标准,例如实现给定接口的类.(免责声明,我是ClassGraph的作者.)ClassGraph可以在内存中为类路径上的所有类或类中的类构建整个类图(所有类,注释,方法,方法参数和字段)的抽象表示.列入白名单的软件包,您可以根据需要查询该类图.ClassGraph支持比任何其他扫描程序更多的类路径规范机制和类加载器,并且还可以与新的JPMS模块系统无缝协作,因此如果您将代码基于ClassGraph,您的代码将最大程度地可移植.请在此处查看API.


文档非常令人印象深刻.
@Alexandros谢谢,你应该查看ClassGraph,它比FastClasspathScanner有了很大的改进.
@AndrewBacker ClassGraph(FastClasspathScanner的新版本)通过过滤器或集合操作完全支持布尔运算.请参阅此处的代码示例:https://github.com/classgraph/classgraph/wiki/Code-examples

4> rmuller..:

如果你想要一个真正重量轻(无依赖性,简单的API,15 kb的jar文件)和非常快的解决方案,来看看annotation-detector在发现https://github.com/rmuller/infomas-asl

免责声明:我是作者.



5> Sławek..:

您可以使用Java Pluggable Annotation Processing API编写将在编译过程中执行的注释处理器,并将收集所有带注释的类并构建索引文件以供运行时使用.

这是进行带注释的类发现的最快方法,因为您不需要在运行时扫描类路径,这通常是非常慢的操作.此方法也适用于任何类加载器,而不仅适用于运行时扫描程序通常支持的URLClassLoaders.

上述机制已在ClassIndex库中实现.

要使用它,请使用@IndexAnnotated元注释来注释自定义注释.这将在编译时创建一个索引文件:META-INF/annotations/com/test/YourCustomAnnotation列出所有带注释的类.您可以通过执行以下命令在运行时访问索引:

ClassIndex.getAnnotated(com.test.YourCustomAnnotation.class)



6> Wolf..:

尝试Scannotation.

它可用于搜索类路径或Web应用程序li​​b目录以获取特定注释.



7> Animesh..:

您可能想要使用http://code.google.com/p/annovention/

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有