Kotlin фильтр memberProperties по существующему классу аннотаций - PullRequest
0 голосов
/ 01 июля 2018

У меня есть метод расширения, работающий на типе 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 Ответ

0 голосов
/ 01 июля 2018

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

@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)
        }
...