使用注解处理器创建带有特定注解的类列表。

7

我有一个自定义注解,并想使用注解处理器生成一个列表,列出我的应用程序中所有使用该特定注解的类。

我找到了这个教程,它描述了如何使用注解处理器生成类文件,因此可以很容易地为每个带有我的注解的类生成一个类。

我无法弄清楚如何将所有信息收集到一个单独的类中。似乎没有办法修改类,因此一旦生成了第一次,就无法将新项附加到列表中。

是否有一种方法可以使用注解处理器生成一个方法,该方法将返回应用程序中使用特定注解注释的所有类的列表?

1个回答

6

生成的类不一定需要与正在处理的输入类一一对应。此外,您可以通过RoundEnvironment搜索带有给定注释的类(元素):

roundEnvironment.getElementsAnnotatedWith(MyAnnotation.class)

从这里可以生成一个类,该类具有返回找到的类集合的方法。

需要强调的一些问题:

  • 注释处理器可以与其他注释处理器一起运行,因此必须处理编译时生成的类。为了支持此功能,Java注释处理是按轮执行的,以允许处理器捕获其他处理器的输出。为了与其他处理器兼容,您需要优雅地处理 ErrorType
  • 仅当前编译传递中的类将从 RoundEnvironmnet 方法返回,因此不会包括外部库中的类。
  • IDE(咳咳Eclipse)以不同于Java的方式实现注释处理设施,这可能对需要像我描述的完整非部分编译的处理器造成问题。

巧合的是,我最近创建了一个类似的项目,可以实现你想要的功能:

https://github.com/johncarl81/silver

Silver目前还在开发中,并使用了很多库代码来完成任务,但它可能为您提供可行的思路。


1
嗨 John!很高兴收到你的来信 :) Silver看起来非常棒,SilverUtils.getAnnotated()的运行时影响如何?此外,在运行时它需要加载除已注释类之外的其他内容吗? - emmby
1
很高兴也听到你的声音,Mike!这种方法最酷的事情是运行时速度尽可能快。一旦你有了Example的实例,唯一的运行时成本就是返回静态变量的成本。SiverUtil.get()确实执行了一些反射来查找类(一个Class.forName()调用),但这个调用被缓存,因此只会执行一次。SilverUtil只是为了方便而存在,从技术上讲,你不必使用它来使用生成的代码。 - John Ericksen
你好,John!很高兴看到这个项目 - Silver),它可能会帮助我进行注解处理器。感谢你的辛勤工作! - hohserg

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