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