Ответ
Аннотация @Target указывает, к каким элементам кода (ElementType) может применяться ваша аннотация. Её параметр — одно или несколько значений из перечисления java.lang.annotation.ElementType:
| ElementType | Применение к |
|---|---|
| TYPE | Классу, интерфейсу, enum или записи (record). |
| FIELD | Полю класса (включая enum-константы). |
| METHOD | Методу класса. |
| PARAMETER | Параметру метода или конструктора. |
| CONSTRUCTOR | Конструктору. |
| LOCAL_VARIABLE | Локальной переменной. |
| ANNOTATION_TYPE | Другой аннотации (для создания мета-аннотаций). |
| PACKAGE | Пакету (через package-info.java). |
| TYPE_PARAMETER | Параметру типа (например, <T>) (с Java 8). |
| TYPE_USE | Любому использованию типа (с Java 8). Самый широкий контекст. |
| MODULE | Модулю (с Java 9). |
Примеры использования @Target:
import java.lang.annotation.*;
// Аннотация только для методов
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {}
// Аннотация для полей и типов (можно несколько значений)
@Target({ElementType.FIELD, ElementType.TYPE})
public @interface Experimental {}
// Аннотация для любого использования типа (например, возвращаемое значение, параметр)
@Target(ElementType.TYPE_USE)
public @interface NonNull {}