例如我有一个班级:
class Foo {
@AnnotatedProp
var foo: Boolean? = null
}
如何在自定义注释处理器中获取foo
属性的类型?
在伪我期待的事情如下:
annotatedElement.getStringifiedReturnTypeSomehow() //returns "Boolean"
答案 0 :(得分:1)
我完成它的方式,确保您的注释具有AnnotationTarget.FIELD
目标。
在获得带有必需注释的Element
实例后,只需:
val returnTypeQualifiedName = element.asType().toString()
如果你想知道它是否可以为空:
private fun isNullableProperty(element: Element): Boolean {
val nullableAnnotation = element.getAnnotation(org.jetbrains.annotations.Nullable::class.java)
if (nullableAnnotation == null) {
return false
} else {
return true
}
}
答案 1 :(得分:-1)
您可以使用反射来获得所需内容。
import kotlin.reflect.full.declaredMemberProperties
import kotlin.reflect.full.findAnnotation
import kotlin.reflect.full.starProjectedType
annotation class AnnotatedProp
class Foo {
@AnnotatedProp
var foo: Boolean? = null
var bar: String? = null
}
fun main(args: Array<String>) {
// Process annotated properties declared in class Foo.
Foo::class.declaredMemberProperties.filter {
it.findAnnotation<AnnotatedProp>() != null
}.forEach {
println("Name: ${it.name}")
println("Nullable: ${it.returnType.isMarkedNullable}")
println("Type: ${it.returnType.classifier!!.starProjectedType}")
}
}
这将打印出来:
Name: foo
Nullable: true
Type: kotlin.Boolean
Kotlin的标准库没有反射,所以一定要添加
compile "org.jetbrains.kotlin:kotlin-reflect:$version_kotlin"
到您的Gradle构建文件。