Рассмотрим следующий класс аннотаций

@Target(AnnotationTarget.TYPE)
annotation class ML(val size: Int)

По умолчанию политика хранения - RUNTIME, поэтому эта аннотация должна быть доступна через отражение.

Теперь у меня есть

val a: @ML(2) List<Int> = listOf(1)

Который компилируется, но при проверке в отладчике получается

a::class.annotations.size = 0

Что я делаю неправильно и как правильно аннотировать типы без упаковки вещей в классы и аннотирования свойств?

0
Victor Ermolaev 10 Фев 2021 в 18:00

1 ответ

Лучший ответ

Вы использовали выражение:

b::class.annotations

Может использоваться для получения аннотаций к классу, возвращаемому b. List не имеет никаких аннотаций, поэтому вы не получите никаких аннотаций. Учитывая место, в которое вы помещаете аннотацию, вы действительно хотите получить аннотации для возвращаемого типа свойства b:

::b.returnType.annotations

РЕДАКТИРОВАТЬ: Я думал, что b было собственностью. То, что вы хотите сделать, невозможно, потому что аннотационная информация не хранится для локальных переменных в JVM. См. Этот вопрос: Могу ли я получить информацию о локальных переменных с помощью отражения Java? (о Ява но все равно). Если бы b был свойством класса или свойством верхнего уровня, то то, что я показал, применилось бы.

0
Nicolas 10 Фев 2021 в 19:19