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