import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

public final class DemoPolitiche {
    @Retention(RetentionPolicy.SOURCE)
    @Target(ElementType.TYPE)
    @interface SoloSorgente { }

    @Retention(RetentionPolicy.CLASS)
    @Target(ElementType.TYPE)
    @interface NelClass { }

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    @interface ARunTime { }

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    @interface NonEreditata { }

    @Inherited
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    @interface Ereditata { }

    @SoloSorgente
    @NelClass
    @ARunTime
    static class Documento { }

    @NonEreditata
    @Ereditata
    static class Base { }

    static class Derivata extends Base { }

    private DemoPolitiche() { }

    public static void main(String[] args) {
        System.out.println("Documento a runtime: "
                + Documento.class.getAnnotations().length);
        System.out.println("Base dichiarate: "
                + Base.class.getDeclaredAnnotations().length);
        System.out.println("Derivata dichiarate: "
                + Derivata.class.getDeclaredAnnotations().length);
        System.out.println("Derivata visibili: "
                + Derivata.class.getAnnotations().length);
    }
}
