Kotlin 能否在 class 个文件中发出 JSR-305 注释

Can Kotlin emit JSR-305 annotations in class files

我将 Kotlin 与 https://github.com/vojtechhabarta/typescript-generator 结合使用,为我的 classes 生成在 API.

中使用的 TypeScript 定义

为了保留可空性信息,typescript-generator 可以使用字段和方法上的注释。它支持构建脚本中列出的任意注释 class 名称。

出于某种原因,Kotlin 使用 @org.jetbrains.annotations.Nullable 而非 JSR-305 注释 @javax.annotation.Nullable.

来注释可空字段

虽然 JSR-305 注释具有 RetentionPolicy.RUNTIME,但 Jetbrains 注释具有 RetentionPolicy.CLASS,因此不适合使用 Java 反射检测注释的库进行内省。

是否可以让 Kotlin 生成基于标准的注释而不是 JetBrains 专有注释?

如果没有,我对处理该问题的简单解决方案感兴趣。也许是一个 Gradle 插件,可以从 JetBrains 或类似的注释中生成 JSR-305 注释。我真的不想用 ?@Nullable.

对所有内容进行双重注释

Kotlin 旨在发出自己的 (JetBrains) 注释。做出此选择是因为 JSR 305 从未发布,并且 JetBrains 没有合法的方式将 JSR 305 注释与编译器捆绑在一起,因为(休眠的)JSR 305 的许可证不允许这样做。 com.google.code.findbugs:jsr305 Maven 工件的法律地位同样不明确,因为 javax 包命名空间是专门为 JSR 保留的。

有以下可能的解决方案:

  1. 编写自定义 Gradle 插件,post-处理 Kotlin 编译的 class 文件,并将 org.jetbrains.annotations.* 注释更改为相应的 javax.annotation.* 注释(NotNullNonnullNullableNullable)并将相应的属性从运行时不可见的注释更改为运行时可见的注释。

  2. 补丁 typescript-generator 以便它除了 Java 反射之外还使用 Kotlin 反射 API 从 Kotlin classes 获取可空性信息。此任务的入口点是 kotlin Java Class 实例的扩展,允许检索所有 Kotlin 元数据。

  3. jackson-module-kotlin 添加到 typescript-generator。该模块使用 Kotlin 的反射来获取所有 Kotlin 特定信息并将其提供给 Jackson,而 typescript-generator 使用 Jackson bean 自省来获取其类型信息,因此它可能会起作用。