Что такое RetentionPolicy для аннотаций в Java?

«Что такое RetentionPolicy для аннотаций в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

RetentionPolicy — это перечисление (enum) в Java, которое определяет, как долго аннотация будет сохраняться в жизненном цикле кода. Задается с помощью мета-аннотации @Retention.

Три политики сохранения:

  1. RetentionPolicy.SOURCE — аннотация сохраняется только в исходном коде и отбрасывается компилятором. Не попадает в .class файлы.

    • Пример: @Override, @SuppressWarnings. Используются только компилятором.
  2. RetentionPolicy.CLASS (значение по умолчанию) — аннотация записывается в .class файл, но недоступна во время выполнения через Reflection.

    • Использование: для инструментов анализа байт-кода (например, инструментирование, генерация кода).
  3. RetentionPolicy.RUNTIME — аннотация записывается в .class файл и доступна во время выполнения через Reflection API (getAnnotation()).

    • Пример: @Test в JUnit, аннотации Spring (@Component, @Autowired).

Пример объявления аннотации:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

// Аннотация будет доступна во время выполнения
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "default";
    int priority() default 0;
}

Почему это важно? Выбор политики влияет на то, сможете ли вы обработать аннотацию во время выполнения (например, для конфигурации фреймворка или запуска тестов).