Определение аннотаций: элементы и значения по умолчанию
Создавайте пользовательские аннотации с помощью @interface, определяйте элементы со значениями по умолчанию и применяйте метааннотации.
«Определение аннотаций: элементы и значения по умолчанию» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Что такое аннотации
Аннотации — это метаданные, применяемые к классам, методам, полям или параметрам. Они не изменяют поведение напрямую, а предоставляют информацию компиляторам, фреймворкам или обработчикам времени выполнения.
Объявление аннотации с помощью @interface
Используйте @interface, чтобы объявить пользовательскую аннотацию. Её элементы выглядят как методы. Значение по умолчанию задаётся с помощью default.
@interface Retry {
int times() default 3;
long delayMs() default 1000L;
Class<? extends Throwable>[] on() default {Exception.class};
}Применение аннотации
Примените аннотацию к целевому элементу. Элементы, у которых есть значения по умолчанию, можно не указывать. Если указан только один элемент с именем value, его можно задать без ключа.
@Retry(times = 5, delayMs = 500)
public void callExternalService() { ... }
// Single-element shorthand:
@interface Label { String value(); }
@Label("production")
public class App {}Типы элементов аннотаций
Элементами могут быть только примитивы (int, long и т. д.), String, Class, перечисление enum, другой тип аннотации или одномерный массив одного из перечисленных типов.
@interface Config {
String host();
int port() default 8080;
LogLevel level() default LogLevel.INFO; // enum
Class<?> handler() default DefaultHandler.class;
String[] tags() default {};
}Мета-аннотации: @Retention
@Retention определяет, как долго сохраняется аннотация: SOURCE (отбрасывается компилятором), CLASS (сохраняется в .class, но недоступна во время выполнения), RUNTIME (доступна через рефлексию).
@Retention(RetentionPolicy.RUNTIME)
@interface Retry {
int times() default 3;
}Мета-аннотации: @Target
@Target ограничивает места, где можно применять аннотацию. Можно указать несколько целевых элементов.
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@interface Audited {
String description() default "";
}@Documented и @Inherited
@Documented включает аннотацию в документацию Javadoc. @Inherited позволяет подклассам наследовать аннотацию от суперкласса (только для аннотаций на уровне класса).
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Category {
String value();
}Повторяемые аннотации @Repeatable
Пометьте аннотацию как @Repeatable, чтобы разрешить её многократное применение к одному элементу. Предоставьте контейнерную аннотацию, содержащую массив.
@Repeatable(Tags.class)
@interface Tag { String value(); }
@interface Tags { Tag[] value(); }
@Tag("fast")
@Tag("stable")
public class Service {}Значения по умолчанию и пропуск элементов
Элементы со значениями default не нужно указывать в месте вызова. Элементы без значений по умолчанию обязательны.
@Retry // uses defaults: times=3, delayMs=1000
public void action1() {}
@Retry(times=1) // overrides only times; delayMs stays 1000
public void action2() {}Аннотация и маркерный интерфейс
Маркерные интерфейсы (например, Serializable) проверяются с помощью instanceof и передают информацию о типе. Аннотации более гибкие: они содержат метаданные и могут иметь элементы.
Распространённые встроенные аннотации
Знайте аннотации JDK: @Override, @Deprecated, @FunctionalInterface, @SuppressWarnings и @SafeVarargs.
@Override
public String toString() { return "User{" + name + "}"; }
@Deprecated(since = "2.0", forRemoval = true)
public void oldMethod() {}Быстрая проверка
Какая единственная политика сохранения делает аннотацию доступной во время выполнения?
Итоги
Объявляйте аннотации с помощью @interface. Используйте @Retention(RUNTIME) для обработки через рефлексию, @Target для ограничения применения и default для необязательных элементов. @Repeatable позволяет использовать аннотацию несколько раз.
Часто задаваемые вопросы
Урок «Определение аннотаций: элементы и значения по умолчанию» бесплатный?
Да — полный текст урока «Определение аннотаций: элементы и значения по умолчанию» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Определение аннотаций: элементы и значения по умолчанию»?
Создавайте пользовательские аннотации с помощью @interface, определяйте элементы со значениями по умолчанию и применяйте метааннотации. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Определение аннотаций: элементы и значения по умолчанию»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Определение аннотаций: элементы и значения по умолчанию
- Политики хранения и типы целей
- Обработка аннотаций во время выполнения
- Процессоры аннотаций во время компиляции