Java Annotations
    Table of Contents hide ►
    
  
  
Annotations are metadata that provide information at the retention level of Java source, class or runtime.
Annotations can be applied to the following targets:
- ANNOTATION_TYPE
- CONSTRUCTOR of the class
- FIELD of class or enum
- LOCAL_VARIABLE
- METHOD
- MODULE
- PACKAGE
- PARAMETER
- TYPE such as class, interface (including annotation type), or enum
- TYPE_PARAMETER of generic
- TYPE_USE
Here the simple custom annotation:
package ex11;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.stream.IntStream;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Repeatable(Annos.class)
@interface Anno {
    String name() default "Anno-n";
    int[] numbers();
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Annos {
    Anno[] value();
}
@Annos({
    @Anno(numbers = 1),
    @Anno(name = "Anno-1", numbers = {1,2})
})
public class AnnoEx1 {
    public static void main(String[] args) {
        Anno[] annos = AnnoEx1.class.getAnnotationsByType(Anno.class);
        for (Anno annotation : annos) {
            System.out.println("name: "+ annotation.name());
            IntStream.of(annotation.numbers())
                .forEach(System.out::println);
        }
    }
    
}
As in the above:
- attribute can have a default value (line# 16)
- can have an array of values (line# 17), including other repeatable annotations (line# 24).
- Attributes are applied with name/value pairs
    - Attributes with default values can be omitted (line# 28, the name is omitted).
- when no attribute, '( )'can be omitted.
- no need to specify the name if there is only one attribute
- if array has one value omit the '{ }'(line# 28).
 
There are predefined annotations such as @Override, @FunctionalInterface, @Deprecated, @SuppressWarnings({"unchecked", "deprecation"}) and @SafeVaragrs(can be only annotated either final or private method).
NOTE: Unchecked warning indicates potential heap pollutions. Especially the annotation @SafeVarargs suppresses heap pollution warning when using var-args.