Чтение пометки в Java
Пометка с политикой RetentionPolicy.RUNTIME
остаётся на типе после сборки. Рефлексия ищет такие
метки на Class и возвращает объект с полями,
объявленными в @interface.
Удобный способ - метод getAnnotation: он даёт
одну метку нужного типа или null, если её нет:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface Stage {
String name();
}
@Stage(name = "alpha")
class Pipeline {}
public class Main {
public static void main(String[] args) {
Stage tag = Pipeline.class.getAnnotation(Stage.class);
System.out.println(tag.name());
}
}
Перед чтением можно проверить наличие метки методом
isAnnotationPresent:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface Owner {
String team();
}
@Owner(team = "billing")
class InvoiceJob {}
public class Main {
public static void main(String[] args) {
if (InvoiceJob.class.isAnnotationPresent(Owner.class)) {
Owner owner = InvoiceJob.class.getAnnotation(Owner.class);
System.out.println(owner.team());
}
}
}
Если меток несколько, смотрят массив
getAnnotations или getDeclaredAnnotations
и отбирают нужный тип вручную. Параметры метки читают
как методы интерфейса - без отдельного API для каждого
поля.
Объявите метку с параметром tier типа
String и сроком RUNTIME. Повесьте
её на класс CachePolicy. Из main
выведите значение tier средствами рефлексии.
Сделайте метку с целым полем version и
класс Schema с этой меткой. Получите метку и напечатайте число
version.