Вопрос проверяет понимание жизненного цикла аннотаций и того, кто и на каком этапе может их использовать.
Retention policy определяет, на каком этапе аннотация доступна: во время компиляции, в байткоде или в runtime. От этого зависит, может ли аннотацию читать фреймворк через reflection. Неправильный выбор retention делает аннотацию бесполезной. Большинство фреймворков требуют runtime-доступа. Поэтому retention напрямую влияет на применимость аннотации.
Retention policy определяет, как долго аннотация «живет» после компиляции.
Retention policy — это правило, задающее этап доступности аннотации.
В Java существует три варианта:
SOURCE
CLASS
RUNTIME
Аннотация:
доступна только в исходном коде
отбрасывается компилятором
не попадает в .class файл
Используется для:
подсказок компилятору
статического анализа
документации
Пример:
@Override
Аннотация:
сохраняется в байткоде
недоступна через reflection
используется инструментами на этапе сборки
Применяется редко и обычно для:
bytecode-инструментов
code generation
Аннотация:
сохраняется в байткоде
доступна через reflection во время выполнения
Именно этот вариант нужен:
Spring
Hibernate
Jackson
Пример:
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {}
Если аннотация:
нужна фреймворку → RUNTIME
нужна только компилятору → SOURCE
Неправильный retention:
ломает функциональность
не дает ошибок компиляции
проявляется только в runtime
Вывод: retention policy определяет, кто и когда может использовать аннотацию, и напрямую влияет на ее работоспособность.