当前位置: 首页 > 知识库问答 >
问题:

如何使我自己的注释处理器增量?

吕宇定
2023-03-14

我创建了一个名为EasyPrefs的注释处理器,当我尝试在我的项目中使用它时,它会显示以下警告。

请求增量注释处理,但禁用支持,因为以下处理器不是增量的:net.androidcart.easyprefs.EasyPrefsProcessor(NON_INCREMENTAL)。

我做了一些研究,没有找到任何关于如何使它增量的教程。是否需要任何梯度配置,或者某些功能需要被覆盖,等等。

共有1个答案

路扬
2023-03-14

要使您的批注处理器增量,您必须在< code > incremental . annotation . processors 文件的META-INF中声明它:

your.fully.qualified.annotation.processor.name,category

有三类注释处理器可供选择:html" target="_blank">动态、隔离和聚合。

基本上在高层次上:

    < li >动态:处理器只能在运行时决定它是否是增量的 < li >隔离:当您的处理器将处理用您的批注隔离的每种类型时(一个输入对应一个或多个输出) < li >聚合:当您的处理器需要聚合几个输入(用您的批注进行了批注的类型)以生成一个或多个输出时

但是,每个类别都有您必须考虑的限制:

动态限制

> < li>

他们必须使用Filer API生成文件。以任何其他方式写文件都会导致以后的无声失败,因为这些文件不会被正确地清理。如果您的处理器这样做,它就不能是增量的。

它们不能依赖于编译器特定的API,如< code > com . sun . source . util . trees 。Gradle封装了处理API,因此尝试转换为编译器特定的类型将会失败。如果您的处理器这样做,它就不能是增量的,除非您有某种回退机制。

如果他们使用Filer#createResource,< code>location参数必须是StandardLocation中的以下值之一:< code>CLASS_OUTPUT 、< code>SOURCE_OUTPUT或< code > NATIVE _ HEADER _ OUTPUT 。任何其他参数都将禁用增量处理。

隔离限制

>

  • 他们必须根据可从其 AST 访问的信息对带注释的类型做出所有决策(代码生成、验证消息)。这意味着您可以分析类型的超类,方法返回类型,注释等,甚至可以传递。但是,您不能根据圆形环境中不相关的元素做出决定。这样做将导致静默失败,因为稍后将重新编译的文件太少。如果您的处理器需要根据其他不相关的元素的组合做出决策,请将其标记为“聚合”。

    它们必须为使用Filer API生成的每个文件提供一个原始元素。如果提供了零个或多个原始元素,Gradle将重新编译所有源文件

    聚合限制

    >

  • 它们只能读取<code>类

    如果用户传递<code>参数

    Gradle留档

    PS:对于动态,您还必须重写<code>getSupportedOptions()

  •  类似资料:
    • 我使用抽象处理器创建了一个自定义注释和注释处理器。这意味着我想在编译之前进行注释处理。我将自定义注释和处理器导出为Jar,并尝试将其与简单的java测试程序一起使用。我确信在编译时它会找到我的java处理器类,但不知何故,我并没有得到我在控制台上期望的o/p。下面是我的处理器中处理方法的代码。 此外,我故意使用以便我得到一个版本警告,它确认当我执行一个测试类时,它找到了我的注释处理器。 这里是我的

    • 刚开始用Android开发,尝试用房库。从昨天开始,我就面对这个警告信息 w: [kapt]请求增量注释处理,但由于以下处理器不是增量的,因此支持被禁用:androidx.lifecycle。生命周期处理器(非增量),androidx.room。房间处理器(非增量)。 我尝试过研究和修复,但无法避免这个错误。构建文件。请就我做错了什么提出建议。

    • 我有一个简单的注释处理器,应用如下: 要使此处理器工作,-函数的名称和-接口函数参数必须匹配。它检查此并使用注释的参数来查看提供的类并在此基础上进行一些代码生成。 它生成一个文件。 我已经阅读了关于增量注释处理的文档,但是我不能决定将哪一个类别应用到这个处理器上。以下是我的考虑: < li >它不能是< code>isolating,因为它并不从带注释的元素的AST中派生所有内容,因为它也从注释参

    • 问题内容: 我正在尝试为局部变量创建注释。我知道我不能在生成的字节码中保留注释,但是我应该能够在编译时通过执行以下操作来访问信息: 仅,当我在以下指定的受支持类型中指定包含“垃圾”的ProcessorFactory时,apt或javac不会对此进行处理: 但是,当我之前移动@Junk批注时,它将起作用 有想法或解决方法? 问题答案: 做了一些快速测试并进行了一些搜索,看起来好像并没有真正被支持。

    • 问题内容: 我可能只是看错了方向,但我发现有关批注处理的JSE文档非常稀疏。我想编写一个注释处理器,该处理器处理带注释的String字段和局部变量,以计算的String表达式替换它们。这应该不会太复杂,但是我对于Javax.annotation.processing的Javadoc却迷失了。 编辑:我需要在编译时处理批注,因为我想修改生成的代码。它应将带注释的常量String表达式替换为计算的St

    • 我正在使用注释处理器来处理方法参数的注释。 用于参数的注释类型有一个注释@参数 现在,当注释处理器运行时,我想检查参数注释()是否有参数注释。我通过执行以下代码来实现这一点。 由于某种原因,arg始终为空。是否有注释未返回的原因?