Java 8 Repeating Annotations Tutorial using @Repeatable with examples
This article explains what are Java 8 Repeating Annotations, how to define Repeating Annotations using the @Repeatable annotation and how these are handled internally. Lastly, it also takes a look at how
Class.java
has been changed in Java 8 to handle Repeating Annotations.
What is the Repeating Annotations feature
As the name suggests, Repeating Annotations imply that a particular annotation is applied multiple times to a declaration.
For example: Lets say there is an annotation @Color
with an attribute name
of type String
. Let us apply @Color
annotation multiple times to another class Shirt
as shown below -
[su_box title="Repeating Annotations example" style="soft" box_color="#fcba43" title_color="#00000" radius="4" Class="for-shortcodebox"][java]@interface Color {
String name();
}
@Color(name = "red")
@Color(name = "blue")
@Color(name = "green")//@Color annotation repeated 3 times
class Shirt {
}[/java][/su_box]
In the above code @Color
is the Repeating Annotation.
Prior to Java 8
Till Java 7, Repeating Annotations defined in the above way would have given a compiler error - Duplicate annotation @Color
....
However, Java 8 onwards Repeating Annotations are allowed, but we need to define an annotation in a specific way to make it repeatable. Lets see how...
How to Define Repeating Annotations in Java 8
Defining a repeating annotation involves two steps:
- Annotate Repeating Annotation with
@Repeatable
: Mark the annotation which can be repeated with@Repeatable
annotation. This is a meta-annotation as it annotates an annotation. - Create a container annotation: Create an annotation which has an attribute which is an array of the Repeating Annotation type.
@Color
annotation repeatable. The implementation would look like this -
[su_box title="Defining @Color as a repeatable annotation" style="soft" box_color="#fcba43" title_color="#00000" radius="4" Class="for-shortcodebox"][java]import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Repeatable(Colors.class)
@interface Color {
String name();
}
@Retention(RetentionPolicy.RUNTIME)
@interface Colors {
Color[] value();
}
@Color(name = "red") @Color(name = "blue") @Color(name = "green")
class Shirt {
}[/java][/su_box]
Where, Colors
is the Container Annotation.
Changes in Class.java
in Java 8 to Support Repeating Annotations
Class.java
, from Java 8 onwards, supports a new method getAnnotationsByType(<Annotation-class>)
method which returns an array of Annotation-Class
type. Lets see an example usage of this new method using @Color
, @Colors
& Shirt
class defined earlier -
[su_box title="Example showing usage of Class.getAnnotationsByType() method" style="soft" box_color="#fcba43" title_color="#00000" radius="4" Class="for-shortcodebox"][java]public class RepeatingAnnotations {
public static void main(String args[]) {
Color[] colorArray = Shirt.class.getAnnotationsByType(Color.class);
for (Color color : colorArray) {
System.out.println(color.name());
}
}
}[/java][/su_box]
OUTPUT of the above code[su_note note_color="#1a1a1a" text_color="#DAD9D7"]red
blue
green[/su_note]
Note - To get the annotation information at runtime do annotate @Colors
annotation with @Retention(RetentionPolicy.RUNTIME)
annotation.
How Java 8 handles Repeating Annotations internally
Java 8 internally treats this Repeating Annotation as an instance of @Colors
holding an array of @Color
. The fact that we do not use @Colors
when we annotate definition of Shirt
class is just easing the syntax for the developer. Internally, the compiler treats it as a @Colors
container annotation with an array of @Color
.
Summary: We looked at what are Repeating Annotations, how to define & use Repeating Annotations, saw changes done in Class.java
to support Repeating Annotations, and finally, learned how Java 8 internally handles Repeating Annotations.