【问题标题】:Annotation processing third party libraries注释处理第三方库
【发布时间】:2017-02-13 17:41:48
【问题描述】:

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

但是,注释处理器无法“看到”依赖项中的注释,可能是因为代码已经编译。有关另一个库的问题,请参阅 here。我的项目问题的演示在分支here 上。来自sample 模块的注解被处理,但来自lib 模块的注解未被处理。

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

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

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

【问题讨论】:

  • 我对你的问题有点困惑。您是否可以提供一个示例,但不能满足您的要求?据我所知,编译与否无关紧要,只要保留策略是运行时。
  • 我的理解是,运行时处理器注释无关紧要,但编译时处理器注释确实如此,这是出于性能原因在 Android 上更常用的模式。我现在没有设置示例项目,但包括我在您拥有的任何项目中引用的 ClassIndex 项目应该演示引用问题中提到的问题。
  • "注释处理器无法“看到”依赖项中的注释,可能是因为代码已经编译" - 您给我们的链接中的回复说“自定义处理器'看到'只编译的类。”好像你没有阅读回复。它可能包含可以解决您的问题的信息。
  • 不,你混淆了这两种用法。他的意思是注释处理器在编译过程中运行,因此它“看到”传递给java编译器的类。来自任何第三方依赖项的类都经过预编译,因此编译器不会“看到”正在编译的项目,它们按原样打包。
  • 这实际上与编译/非编译限制无关。这就是该特定库的工作方式。我认为你已经用不相关的信息污染了这个问题。也许我把事情简化得太多了,但问题似乎只是如何扫描外部库中的注释。

标签: java android android-databinding annotation-processing android-binding-adapter


【解决方案1】:

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

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

【讨论】:

  • 我也想过,但是数据绑定生成的文件是由插件在编译时编写的,所以这意味着插件需要读取资源文件(来自依赖项)所以它可以在生成的文件中包含对它们的引用。那么这意味着来自依赖项的资产在构建时可用于插件吗?我没想到会是这样。
  • 是的,资产在构建时可供应用程序使用。必须合并所有资源,以便您可以从应用程序访问它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
相关资源
最近更新 更多