Java annotations are marked with a @Target
annotation to declare possible joinpoints which can be decorated by that annotation. Values TYPE
, FIELD
, METHOD
, etc. of the ElementType
enum are clear and simply understandable.
Question
WHY to use @Target(ANNOTATION_TYPE)
value? What are the annotated annotations good for? What is their contribution? Give me an explanation of an idea how it works and why I should use it. Some already existing and well-known example of its usage would be great too.
Advertisement
Answer
You can use an annotated annotation to create a meta-annotation, for example consider this usage of @Transactional
in Spring:
/** * Shortcut and more descriptive "alias" for {@code @Transactional(propagation = Propagation.MANDATORY)}. */ @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Transactional(propagation = Propagation.MANDATORY) public @interface RequiresExistingTransaction { }
When you enable Spring to process the @Transactional
annotation, it will look for classes and methods that carry @Transactional
or any meta-annotation of it (an annotation that is annotated with @Transactional
).
Anyway this was just one concrete example how one can make use of an annotated annotation. I guess it’s mostly frameworks like Spring where it makes sense to use them.