メモ置き場

Repeatable Annotationメモ

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;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
// 複数の@Sampleを付与した場合、@Sample.Containerにまとめて格納される
@Repeatable(Sample.Container.class)
public @interface Sample {
    String value();

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @interface Container {
        Sample[] value();
    }
}
import java.util.Arrays;
import java.util.stream.Collectors;

@Sample("a")
@Sample("b")
@Sample("c")
public class Main {
    public static void main(String[] args) {
        System.out.println(Main.class.getAnnotation(Sample.class)); // null

        Sample.Container container = Main.class.getAnnotation(Sample.Container.class);
        System.out.println(
                Arrays.stream(container.value())
                        .map(Sample::value)
                        .collect(Collectors.joining(",")) // a,b,c
        );
    }
}