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
(不要打扰已删除或捕获的类型镜像,它们与源代码没有足够的连接来保留注释)来获取注释。 巧合的是,镜像API被重构,导致新的接口AnnotatedConstruct,并方便地使TypeMirror它的后代。
现在,坏消息是:到Java 8发布时,对检查类型注释的支持显然不是生产就绪的,因此它被屠杀了。 JSR已被重写为暗示“TypeMirror#getAnnotationMirrors”应该不会返回任何内容。
从公共API中删除的支持位仍然可以通过Oracle特定于供应商的Tree API获得(仅在javac中支持)。 Tree#getTypeMirror返回的TypeMirror可能按照您期望的方式包含注释。 但是由于它有问题,你只能通过一系列的黑客获得注释,并且最终,这不会在任何时候都工作(例如在嵌套类型参数的情况下)。 在这个方向看到这个问题的一些研究。
该混乱的修复已在Java 9中合并。我还没有测试过它,但它看起来像TypeMirror#getAnnotationMirrors最终可能会工作。 目前还没有计划将此修复恢复到较旧的Java版本。
链接地址: http://www.djcxy.com/p/40265.html