注解处理第三方库

Annotation processing third party libraries

我正在为一个 Android 项目编写一个注释处理器,并且 运行 遇到了一个情况。我想从库模块处理带注释的 类,即应用程序模块依赖于库模块,需要从库模块处理带注释的 类。

但是,注释处理器无法 "see" 来自依赖项的注释,大概是因为代码已经编译过了。参见 here for an issue on another library. A demonstration of the problem with my project is on the branch here。来自 sample 模块的注释被处理,但来自 lib 模块的注释未被处理。

这一切都很好,我已经放弃了没有这个功能的生活,但事实证明 Android 数据绑定库可以处理来自模块甚至第三方库的注释。例如,This 库提供了 @BindingAdapter 方法,应用程序可以很好地处理这些方法。

我试过在我使用的注释上设置保留类型,但无济于事。我能看到的唯一显着区别是数据绑定处理器以方法为目标,而我的方法以 类(类型)为目标,但我认为这与处理器没有区别。所以我认为这可能与作为 Android 插件一部分的数据绑定处理器有关,但我不确定这对这里有何帮助。

有人知道这是怎么做到的吗?

Android 数据绑定也无法处理依赖项上的注释。相反,它在库的编译时处理库并将信息保存到中间文件作为其存档的一部分(例如 jar 文件)。然后它从依赖项中加载中间文件信息,而不是读取注释。

如果将中间信息保存为jar 文件依赖项的资源,则可以很容易地从jar 文件中提取它。如果我没记错的话,它应该在你的 class 路径中,你可以使用 ClassLoader 的 getResource() 方法。我的记忆可能有点陈旧,因为它不再使用 jar 文件来存储中间文件信息。