Porque meta-programação deve ser fácil.

Refletindo

Você pode facilmente refletir todas as anotações de uma classe:
Class<T> clazz;
List<Annotation> annotations =
new Mirror().on(clazz).reflectAll()
                                   
.annotations().atClass();
Da mesma forma que você também pode facilmente refletir todas as anotações de um field ou de um método:
Class<T> clazz;
List<Annotation> methodAnnotations =
new Mirror().on(clazz).reflectAll()
                           
.annotations().atMethod("nomeMetodo").withoutArgs();
                           
List<Annotation> fieldAnnotations =
new Mirror().on(clazz).reflectAll()
                           
.annotations().atField("nomeField");
Também é possível recuperar um valor de uma propriedade da anotação, como no código seguinte:
FooAnnotation annotation = new Mirror().on(clazz).reflect()
                                   
.annotation(FooAnnotation.class).atClass();
String valor = annotation.aProperty
();
E também funciona para anotações em fields e métodos:
FooAnnotation annotation = new Mirror().on(clazz).reflect()
                       
.annotation(FooAnnotation.class).atField("nomeField");
String valor = annotation.aProperty
();

FooAnnotation annotation =
new Mirror().on(clazz).reflect()
                       
.annotation(FooAnnotation.class)
                       
.atMethod("nomeMetodo").withoutArgs();
String valor = annotation.aProperty
();