Класс ElementType
Класс ElementType - это перечисление (enum) из пакета java.lang.annotation, которое используется в аннотации Target для указания того, к каким именно элементам языка Java может быть применена пользовательская аннотация. Каждое значение перечисления соответствует определённому виду элемента программы: классу, полю, методу, параметру и так далее. Значения ElementType передаются в качестве параметра в аннотацию Target, тем самым ограничивая область применения создаваемой аннотации.
Синтаксис
@Target(ElementType.TYPE)
@Target({ElementType.METHOD, ElementType.FIELD})
@Target(ElementType.PARAMETER)
@Target(ElementType.CONSTRUCTOR)
@Target(ElementType.LOCAL_VARIABLE)
@Target(ElementType.ANNOTATION_TYPE)
@Target(ElementType.PACKAGE)
@Target(ElementType.TYPE_USE)
@Target(ElementType.TYPE_PARAMETER)
@Target(ElementType.MODULE)
@Target(ElementType.RECORD_COMPONENT)
Значения перечисления
Перечисление ElementType содержит следующие константы:
TYPE - класс, интерфейс, перечисление или запись
FIELD - поле класса
METHOD - метод
PARAMETER - параметр метода или конструктора
CONSTRUCTOR - конструктор
LOCAL_VARIABLE - локальная переменная
ANNOTATION_TYPE - тип аннотации
PACKAGE - пакет
TYPE_USE - использование типа
TYPE_PARAMETER - параметр типа
MODULE - модуль
RECORD_COMPONENT - компонент записи
Пример
Давайте создадим аннотацию, которая может применяться только к методам и полям:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.METHOD, ElementType.FIELD})
@interface MyAnnotation
{
}
public class Main
{
@MyAnnotation
private int field = 5;
@MyAnnotation
public void doSomething()
{
System.out.println("Method called");
}
public static void main(String[] args)
{
Main obj = new Main();
obj.doSomething();
System.out.println(obj.field);
}
}
Результат выполнения кода:
"Method called"
"5"
Пример
Давайте создадим аннотацию, применимую только к классам и интерфейсам, и используем её:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@interface ClassOnly
{
}
@ClassOnly
class MyClass
{
public void show()
{
System.out.println("Hello from MyClass");
}
}
public class Main
{
public static void main(String[] args)
{
MyClass obj = new MyClass();
obj.show();
Class<?> clazz = MyClass.class;
boolean present = clazz.isAnnotationPresent(ClassOnly.class);
System.out.println("Annotation present: " + present);
}
}
Результат выполнения кода:
"Hello from MyClass"
"Annotation present: true"
Пример
Давайте посмотрим, какие значения ElementType содержит перечисление:
import java.lang.annotation.ElementType;
public class Main
{
public static void main(String[] args)
{
ElementType[] types = ElementType.values();
for (ElementType type : types)
{
System.out.println(type);
}
}
}
Результат выполнения кода:
TYPE
FIELD
METHOD
PARAMETER
CONSTRUCTOR
LOCAL_VARIABLE
ANNOTATION_TYPE
PACKAGE
TYPE_USE
TYPE_PARAMETER
MODULE
RECORD_COMPONENT
Смотрите также
-
аннотация
Target,
которая использует ElementType для указания области применения -
перечисление
RetentionPolicy,
которое определяет политику хранения аннотаций -
аннотация
Retention,
которая задаёт время жизни аннотации -
аннотация
Annotation,
которая является базовым интерфейсом всех аннотаций