标签: annotation-processing

尽管启用了 kapt. CorrectErrorTypes,kapt 仍将生成的类引用替换为 error.NonExistentClass

我有一个自定义注释处理器,大致执行以下操作:

  • 生成注释类型(使用此类型的类被推迟到后面的轮次)
  • 在后面的一轮中,使用这种类型处理类并为它们生成更多文件

到目前为止,这在 Java 中运行良好。但最近,我将一些类从 Java 转换为 Kotlin。设置仍然相同。但是当我使用生成的注释类型将类转换为 Kotlin 时,会弹出以下错误:

错误:不兼容的类型:NonExistentClass 无法转换为注释 @error.NonExistentClass()

值得注意的是,只有当文件位于 Kotlin 中时才会发生这种情况 - 其他(Java)文件也使用相同的注释,并且当我从 Kotlin 文件中删除注释时它们不会产生错误。

经过一番谷歌搜索后,我发现推荐的解决方案是向以下添加一个选项build.gradle

kapt {
 correctErrorTypes = true 
} 
Run Code Online (Sandbox Code Playgroud)

然而,使用这个并没有解决问题。我查看了生成的存根文件,很明显,尽管设置如下,但它kapt仍然继续放入error.NonExistentClass其中:

kapt {
 correctErrorTypes = true 
} 
Run Code Online (Sandbox Code Playgroud)

我认为值得注意的是:

  • 存根保留了生成注释的正确导入
  • kapt将注释移至静态方法,而原始生成的注释仅支持字段

MyClass看起来像这样:

package my.pckg

import my.pckg.GeneratedAnnotation

class MyClass {

    @GeneratedAnnotation
    var myAnnotatedField: Int = 0

    //...
}

Run Code Online (Sandbox Code Playgroud)

这是build.gradle

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android { …
Run Code Online (Sandbox Code Playgroud)

gradle annotation-processing kotlin kapt

5
推荐指数
0
解决办法
5737
查看次数

Java 11:编译器无法识别 module-info.java 中指定的注释处理器

我有一个名为 Annot 的 Maven 项目,其中包含一个注释“MyAnnot”及其处理器,另一个名为 UseAnnot 的纯 Java 项目包含 MyAnnot(一个名为 User.java 的类用它进行注释。当我指定 UseAnnot 使用“com使用 META-INF.services 目录的 Annot 模块中的“.home.Proc”处理器,一切正常,但现在我使用的是 java 11 并放置了“uses javax.annotation.processing.Processor”和“provides Processor with com” .home.Proc”在各自的模块信息文件中,编译器无法识别注释处理器。

我在Windows cmd中尝试过以下命令:

    javac -cp .;%USERPROFILE%\IdeaProjects\Annot\target\Annot-1.0- 
    SNAPSHOT.jar com\learn\User.java

    javac --module-path 
    %USERPROFILE%\IdeaProjects\Annot\target\Annot-1.0-SNAPSHOT.jar 
    com\learn\User.java
Run Code Online (Sandbox Code Playgroud)

这是 Annot 模块信息文件:

    import javax.annotation.processing.Processor;

    module Annot {
        requires java.compiler;
        exports com.home;
        provides Processor with com.home.Proc;
    }
Run Code Online (Sandbox Code Playgroud)

这是 UseAnnot 模块信息文件:

    module UseAnnot {
        requires java.compiler;
        requires Annot;
        uses javax.annotation.processing.Processor;
    }
Run Code Online (Sandbox Code Playgroud)

UseAnnot\src\com\learn\User.java 看起来像这样:

    package com.learn;

    import com.home.MyAnnot;

    @MyAnnot
    public class User {
        public static …
Run Code Online (Sandbox Code Playgroud)

javac annotation-processing java-11

5
推荐指数
0
解决办法
1305
查看次数

Maven:我可以在annotationProcessorPath中使用依赖管理的版本吗?

我正在我的 dependencyManagement 中导入共享的“物料清单”(bom),如下所示:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.mycompany</groupId>
      <artifactId>common-bom</artifactId>
      <version>1.2.3</version>
      <scope>import</scope>
      <type>pom</type>
    </dependency>
  </dependencies>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)

common-bom定义了版本,然后我只使用它定义的任何版本,如下所示:

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

这一切都很好,除了我也有这个

  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <annotationProcessorPaths combine.children="append">
        <annotationProcessorPath>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.20</version>
        </annotationProcessorPath>
      </annotationProcessorPaths>
    </configuration>
  </plugin>
Run Code Online (Sandbox Code Playgroud)

所以现在我无论如何都需要指定一个 lombok 版本,不是为了实际的依赖项,而是为了注释处理器路径。有没有办法我可以使用相同的值?例如,它可以作为属性存储在 common-bom 中吗?

maven annotation-processing lombok

5
推荐指数
1
解决办法
1082
查看次数

如何将 yolo 注释转换为 coco 格式。杰森?

我想将 yolo 格式的标签转换为 coco 格式我尝试过 https://github.com/Taeyoung96/Yolo-to-COCO-format-converter 和 Pylabel 他们都有一个错误。

我想在 detectorron 2 上进行训练,但由于 json 文件错误,它无法加载数据集。

谢谢大家

image object-detection annotation-processing data-annotations deep-learning

5
推荐指数
1
解决办法
9253
查看次数

将javassist字节代码操作与maven编译集成

我有一个使用javac/aspectj编译器编译的maven项目.
我想在编译javassist程序的类上运行,该程序操作编译的类并向其添加内容.
我想使用"进程类"阶段来运行我的工具.
我的问题是在"target/classes"中创建的类文件上使用javassist进行迭代的最佳方法是什么,以便我可以在之后加载,修复和保存.
另一个要求是在测试类上运行该工具.
如果有一个开源项目做类似的事情,那么很高兴看到一个实例.
谢谢,
Avner

java bytecode-manipulation maven annotation-processing javassist

4
推荐指数
1
解决办法
2984
查看次数

生成实现JSR 308"instanceof @MyAnotations"运行时检查的代码

JSR 308建议向Java添加类型注释.在批准之后,程序员将能够在当前允许Java类型的任何地方添加注释.这不仅包括方法/字段/本地/参数装饰,还包括构造函数调用,类型转换以及最奇怪的实例检查.所述检查器框架使用JSR 308来实现类型限定符像@NonNull上的对象类型,或@Regex对字符串.

现在,Checkers所做的就是静态分析你的代码.那是所有编译时间检查.没关系.但我想要的是一种可以在运行时进行检查的机制.你可以声明:

@Regex String p1 = "[a-z]+";
@Regex String p1 = "[a-z)+";    // compile time error from annotation processor
Run Code Online (Sandbox Code Playgroud)

我也可以写:

if (x instanceof @Regex String) ...
Run Code Online (Sandbox Code Playgroud)

但这没有什么不同x instanceof String,没有执行运行时检查.我需要一个编译时注释处理器运行时字节码操纵器,它允许我在instanceof检查上运行任意代码并返回一个布尔值.这可能与Java有关吗?

java code-generation annotations bytecode-manipulation annotation-processing

4
推荐指数
1
解决办法
287
查看次数

使用元注释触发注释处理器

我已经建立了一个通过注释触发的注释处理器com.foo.FooEntity。有必要能够创建更多的构造型,以触发该注释处理器。

例如,控制器还应该触发此注释处理器。我想知道是否有一种方法可以@FooEntity在上面放置注释。就像是:

@FooEntity
@Target(TYPE)
@Retention(RUNTIME)
public @interface Controller {}
Run Code Online (Sandbox Code Playgroud)

并使用它,以便此类触发注释处理

@Controller
public class MyController { ... }
Run Code Online (Sandbox Code Playgroud)

当然,这里的想法是我想添加新的构造型,而不必接触注释处理器本身。

java annotations annotation-processing

4
推荐指数
1
解决办法
655
查看次数

在AnnotationProcessor中获取带注释的类的包名称

我有一个用AnnotationProcessor处理的类。在此过程中,我有一个实例,javax.lang.model.element.Element可以在该实例中通过来获取带注释的类的名称.getSimpleName()。我知道需要的是带注释的类的packageName(com.software.cool)。

知道如何通过API来接收它吗?

java annotations annotation-processing

4
推荐指数
2
解决办法
843
查看次数

为什么IntelliJ需要Lombok插件?

据我所知,Lombok使用Java的Annotation Processors来生成其他方法.

与Maven 3.5它完全无需添加任何额外的配置,只需添加dependecy龙目岛,并把一些注解一样@Getter,@Setter.

但是,如果我在IntelliJ IDEA 2018.2中打开此项目,则生成的getter/setter的所有用法都会突出显示为错误.我打开了Annotation Processing,我尝试在IntelliJ中构建项目或在Maven中构建然后在IntelliJ中使用,但它仍然需要Lombok插件来避免错误.

这是某种虫子吗?工作流程出错?或者也许龙目岛不仅使用注释处理器,还有其他一些我不知道的东西,这就是为什么IntelliJ + javac无法弄清楚如何处理它?这很奇怪,因为javac本身编译这些文件没有错误

我知道有很多问题"我在使用Lombok时遇到错误"和"使用插件"之类的答案.我不是在问我是否应该使用插件,但为什么我应该使用它,为什么IntelliJ无法在没有插件的情况下处理它而javac呢

java intellij-idea annotation-processing lombok intellij-lombok-plugin

4
推荐指数
1
解决办法
927
查看次数

How to implement build specific annotation retention in Java

I have an annotation that I currently use only for internal build and documentation purposes. It does not offer any value at runtime, which is why I chose @Retention(SOURCE):

@Retention(SOURCE)
public @interface X
Run Code Online (Sandbox Code Playgroud)

However, in order to validate its proper usage, I would like to implement a unit test that navigates the entire API to check whether the annotation is applied everywhere it should be applied to. That unit test would be quite easy to implement by using ordinary …

java unit-testing annotations annotation-processing

4
推荐指数
1
解决办法
236
查看次数