kotlin注释处理器中的可空类型

我正在为Kotlin处理注释处理程序,因为处理的元素是用Java编写的,所以我没有收到可空的数据? 而不是@Nullable注释,这很好,但我正在接受类型和高阶函数中的空参数的问题,正常的参数。

 var someNullField: String? = "" 

我将在其注释中使用@org.jetbrains.annotations.Nullable来接收java.lang.String

但是List<String?>例如会返回我java.util.List<java.lang.String>而不会在主要元素中没有任何注释,而不会在导致未知可空性状态的类型参数中

我尝试使用javax.lang.model.util.Types来找到某种结果,但没有。

我现在使用的一些代码:

 val utils = processingEnvironment.typeUtils val type = fieldElement.asType() if (type is DeclaredType) { val typeElement = utils.asElement(type) type.typeArguments .forEach { //Trying different ways and just printing for possible results val capture = utils.capture(it) val erasure = utils.erasure(it) val element = utils.asElement(it) printMessage("element: $element isNullable: ${element.isNullable()} isNotNull: ${element.isNotNull()}\ncapture: $capture isNullable: ${capture.isNullable()} isNotNull: ${capture.isNotNull()}\nerasure: $erasure isNullable: ${erasure.isNullable()} isNotNull: ${erasure.isNotNull()}") } } 

所有的帮助将不胜感激。

有一点必要的历史:从Java 6开始(当公开镜像API时),Java注释不能用于任何东西,而是可以通过反射访问的相同类型的顶级元素。 您可以注释类,方法和字段,但不能注释类型参数( List<String> )或局部变量( String value = ... )。 Sun / Oracle的工程师已经承认这个限制,在Java 8中诞生了所谓的“类型注释”。

类型注释可以定位任何类型 :局部变量类型数组组件类型 ,类型变量类型 ,甚至返回类型 (后面的注释类似放置,但与方法上的旧注解不同)。 类型注释是通过新的@Target值创建的: ElementType#TYPE_USE 。

当Kotlin人写

 List<String?> 

这真的意味着

 List<@Nullable String> 

它可以被读作:“可空字符串元素列表”。

由于类型本身是有针对性的,所以您需要通过检查它的原始TypeMirror (不要打扰已删除或捕获的TypeMirrors,它们没有足够的连接来源代码来保留注释)来获得注释。 巧合的是,镜像API被重构,导致新的接口AnnotatedConstruct ,并方便地使其成为后代的TypeMirror。


现在坏消息是:在Java 8发布的时候,对于类型注释的支持显然不是生产就绪的,所以被宰杀了。 JSR已被重写为暗示“TypeMirror#getAnnotationMirrors”应该不返回任何内容。

从公共API中删除的支持位仍然可以通过Oracle特定于供应商的Tree API (仅在javac中支持)提供。 Tree#getTypeMirror返回的TypeMirror 可能按照您期望的方式包含注释。 但是由于它有问题,所以只能通过一系列的黑客手段来获得注释,最终这一切都无法正常工作(比如在嵌套类型参数的情况下)。 看到这个问题 ,在这方面的一些研究。

这个混乱的修复是在Java 9中合并的。我还没有测试过,但是看起来像TypeMirror#getAnnotationMirrors最终可能会工作。 目前还没有计划将此修补程序回溯到较旧的Java版本。