Kotlin反射递归

Kotlin反射递归,kotlin,reflection,Kotlin,Reflection,假设我有一个数据类: data class AnotherDataClass( val property: String, @KYC val annotatedProperty: String ) 我想检索带有特定注释的所有字段。我这样做: anotherDataClass::class.memberProperties.filter { it.findAnnotation<KYC>() != null } 是否可以递归检查注释?是的,这确实是可

假设我有一个数据类:

data class AnotherDataClass(
    val property: String,
    @KYC
    val annotatedProperty: String
)
我想检索带有特定注释的所有字段。我这样做:

anotherDataClass::class.memberProperties.filter {
     it.findAnnotation<KYC>() != null
}

是否可以递归检查注释?

是的,这确实是可能的。考虑这个问题最简单的方法是,您希望检查这个类的每个属性以及这个类的属性作为实例的每个类的每个属性。可以这样做:

fun KClass<*>.findAllPropertiesWithKycAnnotation(): List<KProperty<*>> {
    memberProperties.filter {
        it.hasAnnotation<KYC>()
    } + memberProperties.mapNotNull { (it.returnType.classifier as? KClass<*>)?.findAllPropertiesWithKycAnnotation() }.flatten()
}

这是一段又快又脏的代码,肯定有一种更高效的方法来编写它。这完全取决于此函数对性能的关键程度

@Tenfour04我的意思与示例中所描述的完全相同,忽略我糟糕的英语hahaI我相当确定没有办法检索引用特定类实例的所有类。但是,如果使用该注释的所有类都是在同一个类中定义的,则可以使用该类的MyClass::class.nestedClasses属性来获取这些类,并对它们进行迭代,以查找带有该注释的属性。@Tenfour04 nestedClasses为当前示例返回一个空数组:这适用于我,但不是在操场上。由于Kotlin游乐场没有全反射功能,您必须将其复制粘贴到IDE中。
fun KClass<*>.findAllPropertiesWithKycAnnotation(): List<KProperty<*>> {
    memberProperties.filter {
        it.hasAnnotation<KYC>()
    } + memberProperties.mapNotNull { (it.returnType.classifier as? KClass<*>)?.findAllPropertiesWithKycAnnotation() }.flatten()
}