Annotation

Аннотация - являются своего рода метками в коде, описывающими метаданные для функции/класса/пакета. Для обработки аннотации необходимо имплементировать класс которій будет их обрабатывать.

Основные особенности

  1. Пример создания аннотации - public @interface Command
  2. В качестве параметров могут быть использованы только примитивы, String, Enum.

Основные аннотации

  1. @Override - указывает переопределенный метод родительского класса. Делает проверку наличия метода у родителя.
  2. @Deprecated - указывает метод, класс или переменную, которые являются "устаревшими" и могут быть убраны в следующих версиях.
  3. @SuppressWarnings - отключает вывод warning компилятора, относящиеся к элементу над которым она указана.
  4. @SafeVarargs - убирает предупреждения компилятора при использовании varargs с generics.
  5. @Documented - делает так, что аннотация отображается в Javadoc.
  6. @Inherited - отмечает, что аннотация может быть расширена подклассами аннотируемого класса. Изначально если мы используем аннотацию - она не наследуется в потомках с @Inherited будет наследоваться.
  7. @FunctionalInterface - гарантирует, что интерфейс имеет ровно один абстрактный метод (подходит для лямбд).
  8. @Repeatable - позволяет одной аннотации повторяться несколько раз над одним элементом.
  9. @Native - указывает, что константы в интерфейсе предназначены для статического анализа.
  10. Bean Validation (Jakarta Validation, Hibernate Validator)

  11. @Nullable - указывает что параметр может принять null. А метод может вернуть null.
  12. @NotNull - указывает что параметр не может принять null. А метод не может вернуть null.
  13. @Size
  14. @Email
  15. Test

  16. @Test(@Before, @After)

Мета-Аннотации(применяемые к другим аннотациям)

@Retention

@Retention - тип хранения. Определяет, стадию до которой "доживает" аннотация. Можно указать только одну.

  1. RetentionPolicy.SOURCE - аннотация используется при написании кода и должна отбрасываться компилятором. Не сохраняется после компиляции. Для препроцессоров или указаний компилятору.
  2. RetentionPolicy.CLASS - аннтоация будет записана в class-файл компилятором, но не должна быть доступна во время выполнения(runtime).
  3. RetentionPolicy.RUNTIME - аннотация будет записана в class-файл и доступна во время выполнения через reflection.

Пример: @Retention(RetentionPolicy.RUNTIME)

@Target

@Target - тип объекта над которым будет использовано. Можно указывать несколько.

  1. ElementType.ANNOTATION_TYPE - другая аннотация.
  2. ElementType.CONSTRUCTOR - конструктор класса.
  3. ElementType.FIELD - поле класса.
  4. ElementType.LOCAL_VARIABLE - локальная переменная.
  5. ElementType.METHOD - метод класса.
  6. ElementType.PACKAGE - описание пакета package.
  7. ElementType.PARAMETER - параметр метода. Пример: public void hello(@Annotation String param){}
  8. ElementType.TYPE - указывается над классом.

Пример: @Target({ ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})

Пример создания

public @interface Service {
    String name();
    boolean lazyLoad() default false;
}