Создавали ли вы собственные аннотации в Java?

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

Ответ

Да. Пользовательские аннотации в Java создаются с помощью ключевого слова @interface. Они позволяют добавлять метаданные к элементам кода, которые затем могут быть обработаны на этапе компиляции или во время выполнения (runtime).

Пример: создание аннотации для валидации поля

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME) // Аннотация доступна в runtime
@Target(ElementType.FIELD) // Аннотация применима только к полям класса
public @interface NotNull {
    String message() default "Field cannot be null"; // Параметр с значением по умолчанию
}

Пример использования аннотации:

public class User {
    @NotNull(message = "Name is required!")
    private String name;
}

Ключевые элементы аннотации:

  • @Retention — определяет жизненный цикл аннотации: SOURCE (только в исходном коде), CLASS (в байт-коде) или RUNTIME (доступна через рефлексию).
  • @Target — ограничивает элементы программы, к которым можно применить аннотацию (например, TYPE, FIELD, METHOD).
  • Параметры — объявляются как методы, но используются как атрибуты. Могут иметь значения по умолчанию (default).

Применение: кастомные аннотации часто используются для создания фреймворков валидации, конфигурации (как в Spring), генерации кода (Lombok) или для реализации аспектно-ориентированного программирования (AOP).