Аннотация Repeatable
Аннотация Repeatable - это мета-аннотация, которая
позволяет применять одну и ту же аннотацию к одному
элементу кода более одного раза. В качестве параметра
аннотация принимает класс-контейнер, который должен
содержать массив повторяемых аннотаций. Этот класс
автоматически создается компилятором, если он не указан
явно, но должен быть объявлен вручную для совместимости.
Синтаксис
@Repeatable(ContainerAnnotation.class)
public @interface MyAnnotation
{
String value();
}
Пример
Давайте создадим повторяемую аннотацию Skill
и применим ее несколько раз к классу:
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Skills.class)
@interface Skill
{
String value();
}
@Retention(RetentionPolicy.RUNTIME)
@interface Skills
{
Skill[] value();
}
@Skill("Java")
@Skill("Python")
public class Main
{
public static void main(String[] args)
{
Skill[] skills = Main.class.getAnnotationsByType(Skill.class);
for (Skill skill : skills)
{
System.out.println(skill.value());
}
}
}
Результат выполнения кода:
"Java"
"Python"
Пример
Давайте проверим, что контейнерная аннотация действительно хранит массив:
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Tags.class)
@interface Tag
{
String value();
}
@Retention(RetentionPolicy.RUNTIME)
@interface Tags
{
Tag[] value();
}
@Tag("a")
@Tag("b")
@Tag("c")
public class Main
{
public static void main(String[] args)
{
Tags tags = Main.class.getAnnotation(Tags.class);
for (Tag tag : tags.value())
{
System.out.println(tag.value());
}
}
}
Результат выполнения кода:
"a"
"b"
"c"
Смотрите также
-
аннотация
Annotation,
которая является базовой для всех аннотаций -
аннотация
Retention,
которая задает политику хранения -
аннотация
Target,
которая ограничивает область применения -
перечисление
RetentionPolicy,
которое содержит политики хранения