kotlin - 从自定义类注解中获取类属性
问题描述
我有一个自定义类注释,我想使用带注释的类的属性名称和类型生成一个关联的类。是否可以收集这些信息?
@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"
}
}
}
解决方案
可以使用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()
)
}
}
}
推荐阅读
- javascript - 单击链接打开一个新页面,然后打开手风琴并滚动到带有 ID 的部分
- python - 使用 [None].T 生成的 Python Numpy 数组
- r - 鱿鱼游戏第 7 集与模拟
- c++ - QAbstractTableModel 和 QSortFilterProxyModel - 如何清除数据和更新视图
- r - R:根据值的彩色矩阵
- azure - 使用 pyspark 在 azure synapse studio 中获取文件的完整路径
- android - 如何在 Xamarin Android(本机)中的标签中设置自动换行?
- amazon-web-services - 可以通过 Web 界面创建 Elastic Beanstalk 应用程序,但不能通过具有相同帐户的 awscli/ebcli
- java - 如何按专辑中的曲目数量过滤此歌曲
- javascript - td 内选择标签的值