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