java - 注释生成的 Java 源可为空性(适用于 Kotlin)

标签 java annotations kotlin

我正在使用源生成工具 ( ) 为我的项目生成 Java 源文件。然而,我的大部分(如果不是全部)代码都是用 Kotlin 编写的。

Kotlin 已经提供 great Java interop ,因此使用生成的源不是问题。然而,由于 Kotlin brings Java's nullable types into a null-safe system ,我失去了使用 Kotlin 的大部分空安全性。最好的情况是我有平台类型的警告(使类型明确以避免微妙的错误);在最坏的情况下,我会遇到意想不到的崩溃和微妙的错误。

但是,Kotlin 确实尊重 nullability annotations ,例如 JSR-305、FindBugs、Lombok、Eclipse 和 JetBrains 各自形式的 @Nullable/@NonNull,将它们作为适当的非 null 类型或可选类型引入.

因为代码已生成,并且我可以访问源代码(并了解其工作原理),所以我知道哪些函数可以/不返回 null,并且希望对它们进行注释,以便它们包括整齐地进入我的空安全代码。但是,我无法直接将注释添加到代码中,因为它是在构建步骤期间生成的,并且会覆盖任何手动更改。

为了在空安全代码中使用,是否可以/注释生成的 java 源的可空性的最佳方法是什么?

最佳答案

最好的方法是修改源代码生成器,使其包含您需要的注释。

如果您无法修改生成器(例如,因为生成器是专有的并且您没有其源代码),那么您可以使用字节码工程来完成此操作。例如,ASM 站点上的此页面提供了一种方法:

当然,无论哪种情况,您都需要某种方式来告诉工具(生成器、字节码重写器等)应该注释哪些方法。

关于java - 注释生成的 Java 源可为空性(适用于 Kotlin),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41528843/

相关文章:

java - 用于使用智能卡签名的跨平台 Java Applet

javascript - 带有 JavaScript 警报/提示的 Android WebViewClient

java - 为什么 Point 的 Set.contains() 比大小为 2 的 List<Integer> 快得多?

spring-mvc - 类型 元素 "mvc"的前缀 "mvc:annotation-driven"未绑定(bind)

kotlin - 如何在 Kotlins "-> empty"中处理 "when"

android - 将 SwipeToDismiss LazyColumn 项目恢复到原始状态?

Java 通用类型语法

java - Hibernate 多对多级联删除

java - 如何以重构安全的方式分配方法名称(或注释元素)字符串?

java - 如何在 Android Studio 项目中添加 Kotlin 类?