12

我有很多处理特定消息类型的处理程序类。要注册所有这些处理程序,我需要知道存在哪些处理程序。目前,它们都使用特定的注释进行注释,我使用 Java 6 注释处理器来获取所有这些注释,并创建一个 Register 类来保存每个注释类型的实例。

如果同时构建整个树,这非常有用,但如果只构建一个带注释的类(例如,当我在 Eclipse 中保存文件时),处理器只会看到该类型,并构建一个不完整的寄存器。在这种情况下如何检查其他类型?

4

2 回答 2

6

我现在已经很好地解决了这个问题。我所做的有点骇人听闻,但基本上对于我看到的每个带注释的类,我都会将其名称添加到 HashSet。然后我使用 Filer.getResource() 打开一个文件,其中记录了所有以前看到的带注释的类,并将它们也添加到 HashSet 中。然后我生成寄存器类,并使用 Filer.createResource() 将整个 HashSet 写入同一资源。如果我删除带注释的类型,这将导致问题,因为它仍会记录在该文件中,但我可以清理项目或删除该文件来解决它。

编辑:另外,我相信将适当的“原始元素”传递给 Filer.createSource() 应该允许 Eclipse 正确跟踪这些依赖项,但事实并非如此。也许那是一个 Eclipse 错误。

于 2012-05-22T21:20:11.410 回答
1

不出所料,编译时注释处理器只处理正在编译的文件。Eclipse 使用增量编译来节省时间,所以简短的回答是您不能期望您的注释处理器一次看到所有类型。

一种解决方案是更改您的体系结构以支持增量编译。例如,对于每个 annotated HandlerClass,生成一个RegisterHandlerClass注册该处理程序类的类。

也就是说,听起来你正在做的事情最好在运行时完成,也许在Reflections这样的工具的帮助下。

于 2012-05-17T01:49:17.377 回答