Чтение пометки в Kotlin
Пометка с AnnotationRetention.RUNTIME остаётся на типе
после сборки. Рефлексия Kotlin ищет такие метки на
KClass и возвращает объект с полями, объявленными
в annotation class.
Удобный способ - findAnnotation из
kotlin.reflect.full: он даёт одну метку
нужного типа или null, если её нет:
import kotlin.reflect.full.findAnnotation
@Retention(AnnotationRetention.RUNTIME)
annotation class Stage(val name: String)
@Stage("alpha")
class Pipeline
fun main() {
val tag = Pipeline::class.findAnnotation<Stage>()
println(tag?.name)
}
Если меток одного типа может быть несколько, смотрят
коллекцию annotations у того же класса и берут
первый подходящий элемент:
@Retention(AnnotationRetention.RUNTIME)
annotation class Stage(val name: String)
@Stage("beta")
class Pipeline
fun main() {
val tag = Pipeline::class.annotations
.filterIsInstance<Stage>()
.first()
println(tag.name)
}
Параметры метки читают как обычные свойства Kotlin - без отдельного API для каждого поля:
import kotlin.reflect.full.findAnnotation
@Retention(AnnotationRetention.RUNTIME)
annotation class Owner(val team: String)
@Owner("billing")
class InvoiceJob
fun main() {
val owner = InvoiceJob::class.findAnnotation<Owner>()
if (owner != null) {
println(owner.team)
}
}
Объявите метку с параметром tier типа
String и сроком RUNTIME. Повесьте
её на класс CachePolicy. Из main
выведите значение tier через рефлексию.
Сделайте метку с целым полем version и
класс Schema с этой меткой. Получите метку
через annotations и напечатайте число
version.