Kotlin过滤器成员属性(按当前注释类)

时间:2018-06-30 22:47:46

标签: android reflection kotlin kotlin-reflect

我有一个在Any类型上运行的扩展方法。 在该扩展方法(this指向目标实例)上,我试图根据注释的存在来过滤memberProperty。

this::class.memberProperties
        .filter{ it.annotations.map { ann -> ann.annotationClass }.contains(ValidComponent::class)}

但是it.annotations的大小始终为0

实例上的变量声明示例: @ValidComponent var x: SomeType = constructorParam.something@ValidComponent lateinit var x: SomeType

1 个答案:

答案 0 :(得分:0)

这是注释所应用的问题。如果您的注释的目标是“属性”,则您的代码将列出它们就可以了:

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY)
annotation class ValidComponent

I assume您的注释具有一个“字段”目标,在这种情况下,您将不得不跳过Java反射以在属性上列出注释:

this::class.memberProperties
        .filter { property ->
            val fieldAnnotations = property.javaField?.annotations
            fieldAnnotations != null && fieldAnnotations.map { ann -> ann.annotationClass }.contains(ValidComponent::class)
        }