1

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

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

4

1 回答 1

0

这是应用注释的问题。如果您有一个带有“属性”目标的注释,您的代码会很好地列出它们:

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

我假设您的注释有一个“字段”目标,在这种情况下,您必须跳过 Java 反射来列出属性上的注释:

this::class.memberProperties
        .filter { property ->
            val fieldAnnotations = property.javaField?.annotations
            fieldAnnotations != null && fieldAnnotations.map { ann -> ann.annotationClass }.contains(ValidComponent::class)
        }
于 2018-07-01T05:09:59.737 回答