首页 > 解决方案 > 从自定义类注解中获取类属性

问题描述

我有一个自定义类注释,我想使用带注释的类的属性名称和类型生成一个关联的类。是否可以收集这些信息?

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
annotation class Associated

//==============================

@Associated
data class SomeClass(
    val property1: String,
    val property2: Boolean,
    val property3: SomeEnumClass
)

//==============================

class Processor : AbstractProcessor() {
    override fun getSupportedAnnotationTypes() = setOf(
        Associated::class.java.canonicalName,
    )

    override fun process(annotations: Set<TypeElement>?, roundEnv: RoundEnvironment): Boolean {
        roundEnv.getElementsAnnotatedWith(Associated::class.java).forEach { element ->

            // QUESTION: How to get a list of properties of this element? i.e. For `SomeClass`:
            // name: "property1" of type name "String"
            // name: "property2" of type name "Boolean"
            // name: "property3" of type name "SomeEnumClass"
        }
    }
}

标签: kotlinannotations

解决方案


可以使用element.enclosedElements获取封闭的元素,然后过滤ElementKind.FIELD

override fun process(annotations: Set<TypeElement>?, roundEnv: RoundEnvironment): Boolean {
        roundEnv.getElementsAnnotatedWith(Associated::class.java).forEach { element ->
            element.enclosedElements.filter {
                it.kind == ElementKind.FIELD
            }.forEach { fieldElement ->
                val name = fieldElement.simpleName.toString(),
                val type = fieldElement.asType().toString()
            )
        }
    }
}

推荐阅读