我有很多处理特定消息类型的处理程序类。要注册所有这些处理程序,我需要知道存在哪些处理程序。目前,它们都使用特定的注释进行注释,我使用Java 6注释处理器来获取所有这些注释,并创建一个Register类,其中包含每个带注释类型的实例。
如果整个树一次构建,这很有用,但是如果只构建一个带注释的类(例如,当我在Eclipse中保存文件时),处理器只能看到该类型,并构建一个不完整注册。如何检查此方案中的其他类型?
答案 0 :(得分:6)
我现在已经解决了这个问题。我所做的是一个小hackey,但基本上对于我看到的每个带注释的类,我将其名称添加到HashSet。然后我使用Filer.getResource()来打开一个文件,我已经记录了所有以前看过的带注释的类,并将它们添加到HashSet中。然后我生成寄存器类,并使用Filer.createResource()将整个HashSet写入相同的资源。如果我删除带注释的类型,这将导致问题,因为它仍将被记录在该文件中,但我可以清理项目或删除该文件来解决它。
编辑:另外,我认为将适当的“原始元素”传递给Filer.createSource()应该允许Eclipse正确地跟踪这些依赖项,但事实并非如此。也许这是一个Eclipse bug。答案 1 :(得分:1)
不出所料,编译时注释处理器只处理正在编译的文件。 Eclipse使用渐进式编译来节省时间,因此简短的回答是您不能指望注释处理器在一次传递中查看所有类型。
一种解决方案是更改架构以支持渐进式编译。例如,对于每个带注释的HandlerClass
,生成一个注册该处理程序类的RegisterHandlerClass
类。
那就是说,听起来你在做什么会在运行时做得更好,也许借助Reflections之类的工具。