Kotlin фильтр memberProperties по существующему классу аннотаций

У меня работает метод расширения 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

1 ответ

Решение

Это проблема, с которой применяются аннотации. Если бы у вас была аннотация с целью "свойство", ваш код перечислял бы их просто отлично:

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

Я предполагаю, что ваша аннотация вместо этого имеет цель "field", и в этом случае вам придется перепрыгнуть через отражение Java, чтобы перечислить аннотации для ваших свойств:

this::class.memberProperties
        .filter { property ->
            val fieldAnnotations = property.javaField?.annotations
            fieldAnnotations != null && fieldAnnotations.map { ann -> ann.annotationClass }.contains(ValidComponent::class)
        }
Другие вопросы по тегам