На какие элементы программы в Java можно нацелить аннотацию с помощью @Target?

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

Ответ

Аннотация @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 {}