Java / Kotlin注释处理器:获取带注释的字段/属性的类型

时间:2017-09-20 13:53:05

标签: java annotations kotlin

例如我有一个班级:

class Foo {
  @AnnotatedProp
  var foo: Boolean? = null
}

如何在自定义注释处理器中获取foo属性的类型? 在伪我期待的事情如下: annotatedElement.getStringifiedReturnTypeSomehow() //returns "Boolean"

2 个答案:

答案 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构建文件。