Anotações Repetidas (Repeating Annotations)

1 Problema antes do Java 8 Não era possível declarar a mesma anotação várias vezes. Tentativa gerava erro: Duplicate annotation. 2 Solução: @Repeatable Agora é possível usar anotações múltiplas em um mesmo elemento. Definindo a anotação repetível: Usar @Repeatable apontando para um "container" (ex.: @Roles): @Repeatable(Roles.class) @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE}) public @interface Role { String value(); } Container de anotações: @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE}) public @interface Roles { Role[] value(); } Aplicação prática: @Role("presidente") @Role("diretor") public class RelatorioController { } 3 Recuperando anotações com Reflection Método getAnnotationsByType facilita acesso: RelatorioController controller = new RelatorioController(); Role[] annotationsByType = controller.getClass().getAnnotationsByType(Role.class); Arrays.asList(annotationsByType) .forEach(a -> System.out.println(a.value())); Exemplo: ExemploAnotacoesRepetidas.java

Apr 29, 2025 - 23:44
 0
Anotações Repetidas (Repeating Annotations)

1 Problema antes do Java 8
Não era possível declarar a mesma anotação várias vezes.

Tentativa gerava erro: Duplicate annotation.

2 Solução: @Repeatable
Agora é possível usar anotações múltiplas em um mesmo elemento.

Definindo a anotação repetível:
Usar @Repeatable apontando para um "container" (ex.: @Roles):

@Repeatable(Roles.class)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE})
public @interface Role {
String value();
}

Container de anotações:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE})
public @interface Roles {
Role[] value();
}

Aplicação prática:
@Role("presidente")
@Role("diretor")
public class RelatorioController { }

3 Recuperando anotações com Reflection
Método getAnnotationsByType facilita acesso:

RelatorioController controller = new RelatorioController();
Role[] annotationsByType = controller.getClass().getAnnotationsByType(Role.class);
Arrays.asList(annotationsByType)
.forEach(a -> System.out.println(a.value()));

Exemplo: ExemploAnotacoesRepetidas.java