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 保留的。
有以下可能的解决方案:
编写自定义 Gradle 插件,post-处理 Kotlin 编译的 class 文件,并将 org.jetbrains.annotations.*
注释更改为相应的 javax.annotation.*
注释(NotNull
到 Nonnull
和 Nullable
到 Nullable
)并将相应的属性从运行时不可见的注释更改为运行时可见的注释。
补丁 typescript-generator
以便它除了 Java 反射之外还使用 Kotlin 反射 API 从 Kotlin classes 获取可空性信息。此任务的入口点是 kotlin Java Class
实例的扩展,允许检索所有 Kotlin 元数据。
将 jackson-module-kotlin
添加到 typescript-generator
。该模块使用 Kotlin 的反射来获取所有 Kotlin 特定信息并将其提供给 Jackson,而 typescript-generator
使用 Jackson bean 自省来获取其类型信息,因此它可能会起作用。
我将 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 保留的。
有以下可能的解决方案:
编写自定义 Gradle 插件,post-处理 Kotlin 编译的 class 文件,并将
org.jetbrains.annotations.*
注释更改为相应的javax.annotation.*
注释(NotNull
到Nonnull
和Nullable
到Nullable
)并将相应的属性从运行时不可见的注释更改为运行时可见的注释。补丁
typescript-generator
以便它除了 Java 反射之外还使用 Kotlin 反射 API 从 Kotlin classes 获取可空性信息。此任务的入口点是 kotlin JavaClass
实例的扩展,允许检索所有 Kotlin 元数据。将
jackson-module-kotlin
添加到typescript-generator
。该模块使用 Kotlin 的反射来获取所有 Kotlin 特定信息并将其提供给 Jackson,而typescript-generator
使用 Jackson bean 自省来获取其类型信息,因此它可能会起作用。