Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: annotation, target

Для чего используются @Target и @Retention и какие виды RetentionPolicy существуют?

Вопрос проверяет знание устройства аннотаций и понимание, как и где они доступны.

Короткий ответ

@Target определяет, к каким элементам кода можно применять аннотацию. @Retention определяет, как долго аннотация хранится и доступна ли она в runtime. Существует три варианта RetentionPolicy: SOURCE, CLASS и RUNTIME. От выбранного retention зависит, сможет ли аннотацию использовать фреймворк. Для Spring обычно нужен RUNTIME.

Длинный ответ

Аннотация — это не только её поля, но и правила использования.

Определение

@Target — указывает, к каким элементам Java-кода можно применять аннотацию.
@Retention — указывает, на каком этапе жизни программы аннотация доступна.

@Target

Определяет область применения аннотации.

Примеры:

  1. ElementType.TYPE — класс, интерфейс

  2. ElementType.METHOD — метод

  3. ElementType.FIELD — поле

  4. ElementType.PARAMETER — параметр

  5. ElementType.CONSTRUCTOR — конструктор

Пример:

@Target(ElementType.METHOD)
public @interface Loggable {
}

@Retention

Определяет, как долго аннотация существует.

Виды RetentionPolicy

  1. SOURCE

    • Доступна только в исходном коде

    • Не попадает в байткод

    • Используется для подсказок и проверок

  2. CLASS

    • Попадает в байткод

    • Недоступна через reflection в runtime

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

  3. RUNTIME

    • Доступна в runtime

    • Читается через reflection

    • Используется фреймворками

Почему для Spring нужен RUNTIME

Spring:

  1. Сканирует классы

  2. Читает аннотации через reflection

  3. Принимает решения на основе metadata

Без RUNTIME аннотация просто «невидима» контейнеру.

Вывод

@Target ограничивает место применения аннотации, а @Retention — время её жизни. Для фреймворков почти всегда нужен RetentionPolicy.RUNTIME.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • Java

    Java

Ключевые слова

#annotation

#target

Подпишись на Java Developer в телеграм