Annotation
Аннотация - являются своего рода метками в коде, описывающими метаданные для функции/класса/пакета. Для обработки
аннотации необходимо имплементировать класс которій будет их обрабатывать.
Основные особенности
- Пример создания аннотации - public @interface Command
- В качестве параметров могут быть использованы только примитивы, String, Enum.
Основные аннотации
- @Override - указывает переопределенный метод родительского класса. Делает проверку наличия метода у родителя.
- @Deprecated - указывает метод, класс или переменную, которые являются "устаревшими" и могут быть убраны
в следующих версиях.
- @SuppressWarnings - отключает вывод warning компилятора, относящиеся к элементу над которым
она указана.
- @SafeVarargs - убирает предупреждения компилятора при использовании varargs с generics.
- @Documented - делает так, что аннотация отображается в Javadoc.
- @Inherited - отмечает, что аннотация может быть расширена подклассами аннотируемого класса. Изначально
если мы используем аннотацию - она не наследуется в потомках с @Inherited будет наследоваться.
- @FunctionalInterface - гарантирует, что интерфейс имеет ровно один абстрактный метод (подходит для лямбд).
- @Repeatable - позволяет одной аннотации повторяться несколько раз над одним элементом.
- @Native - указывает, что константы в интерфейсе предназначены для статического анализа.
Bean Validation (Jakarta Validation, Hibernate Validator)
- @Nullable - указывает что параметр может принять null. А метод может вернуть null.
- @NotNull - указывает что параметр не может принять null. А метод не может вернуть null.
- @Size
- @Email
Test
- @Test(@Before, @After)
Мета-Аннотации(применяемые к другим аннотациям)
@Retention
@Retention - тип хранения. Определяет, стадию до которой "доживает" аннотация. Можно указать только одну.
- RetentionPolicy.SOURCE - аннотация используется при написании кода и должна отбрасываться компилятором.
Не сохраняется после компиляции. Для препроцессоров или указаний компилятору.
- RetentionPolicy.CLASS - аннтоация будет записана в class-файл компилятором, но не должна быть доступна
во время выполнения(runtime).
- RetentionPolicy.RUNTIME - аннотация будет записана в class-файл и доступна во время выполнения через
reflection.
Пример: @Retention(RetentionPolicy.RUNTIME)
@Target
@Target - тип объекта над которым будет использовано. Можно указывать несколько.
- ElementType.ANNOTATION_TYPE - другая аннотация.
- ElementType.CONSTRUCTOR - конструктор класса.
- ElementType.FIELD - поле класса.
- ElementType.LOCAL_VARIABLE - локальная переменная.
- ElementType.METHOD - метод класса.
- ElementType.PACKAGE - описание пакета package.
- ElementType.PARAMETER - параметр метода. Пример: public void hello(@Annotation String param){}
- ElementType.TYPE - указывается над классом.
Пример: @Target({ ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
Пример создания
public @interface Service {
String name();
boolean lazyLoad() default false;
}