Аннотация @Retention

Аннотация @Retention определяет политику удержания (retention policy) для пользовательских аннотаций. Она указывает, будет ли аннотация доступна только в исходном коде, сохранится в скомпилированном байт-коде или будет доступна через рефлексию во время выполнения. Принимает один параметр типа AnnotationRetention.

Импорт

kotlinimport kotlin.annotation.AnnotationRetention
import kotlin.annotation.Retention

Синтаксис

kotlin@Retention(AnnotationRetention.SOURCE)
annotation class MyAnnotation
kotlin@Retention(AnnotationRetention.BINARY)
annotation class MyAnnotation
kotlin@Retention(AnnotationRetention.RUNTIME)
annotation class MyAnnotation

Параметры AnnotationRetention

Тип AnnotationRetention имеет три возможных значения:

Пример

Создадим аннотацию с политикой удержания только в исходном коде:

kotlin@Retention(AnnotationRetention.SOURCE)
annotation class MarkForReview

Такая аннотация будет удалена после компиляции и недоступна во время выполнения.

Пример

Создадим аннотацию с политикой удержания в байт-коде:

kotlin@Retention(AnnotationRetention.BINARY)
annotation class Serializable

Аннотация сохранится в скомпилированном классе, но не будет доступна через рефлексию.

Пример

Создадим аннотацию с политикой удержания во время выполнения:

kotlin@Retention(AnnotationRetention.RUNTIME)
annotation class ApiEndpoint(val path: String)

Такая аннотация будет доступна через рефлексию и может использоваться для обработки во время выполнения программы.

Пример

Использование аннотации с политикой RUNTIME и проверка через рефлексию:

kotlin@Retention(AnnotationRetention.RUNTIME)
annotation class TestCase(val id: Int)

@TestCase(id = 42)
class MyTestClass

val annotation = MyTestClass::class.annotations
  .filterIsInstance<TestCase>()
  .firstOrNull()

println(annotation?.id)

Результат выполнения кода:

kotlinInt 42

Значение по умолчанию

Если аннотация @Retention не указана явно, то по умолчанию используется значение RUNTIME. Это отличается от Java, где по умолчанию используется CLASS.

kotlin// По умолчанию имеет RetentionPolicy.RUNTIME
annotation class MyAnnotation

Смотрите также

  • ключевое слово annotation,
    которое используется для объявления аннотаций
  • ключевое слово target,
    которое определяет допустимые цели для применения аннотации
  • ключевое слово repeatable,
    которое позволяет применять аннотацию multiple раз к одному элементу