Kotlin可以在类文件中发出JSR-305注释

时间:2017-09-15 21:03:46

标签: types kotlin nullable

我使用Kotlin和https://github.com/vojtechhabarta/typescript-generator为我在API中使用的类生成TypeScript定义。

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

Kotlin出于某种原因使用@org.jetbrains.annotations.Nullable而不是JSR-305注释@javax.annotation.Nullable来注释可空字段。

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

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

如果没有,我对解决问题的简单解决方案感兴趣。也许Gradle插件可以从JetBrains或类似的东西生成JSR-305注释。我更愿意不必使用?@Nullable对所有内容进行双重注释。

1 个答案:

答案 0 :(得分:3)

Kotlin旨在发出自己的(JetBrains)注释。之所以选择是因为JSR 305从未发布过,并且JetBrains没有合法的方式将JSR 305注释与编译器捆绑在一起,因为(休眠)JSR 305上的许可证不允许它。 com.google.code.findbugs:jsr305 maven工件的合法状态同样是模糊的,因为javax包命名空间是专门为JSR保留的。

有以下可能的解决方案:

  1. 编写一个自定义Gradle插件,对后续处理Kotlin编译的类文件并将org.jetbrains.annotations.*注释更改为相应的javax.annotation.*注释(NotNullNonnullNullableNullable)并将相应的attiributes从运行时不可见注释更改为运行时可见注释。

  2. 修补程序typescript-generator,以便除了Java Reflection之外还使用Kotlin反射API从Kotlin类中获取nullablitity信息。此任务的入口点是kotlin扩展Java Class实例,允许检索所有Kotlin元数据。

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