import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Inherited
@ContainedBy(FooContainer.class)
@interface Foo {
  int value();
}

@Retention(RetentionPolicy.RUNTIME)
@Inherited
@ContainerFor(Foo.class)
@interface FooContainer {
  Foo[] value();
}

@FooContainer(value = {@Foo(1), @Foo(2)})
class SuperClass { } 

@Foo(3)
class ContainerOnSuperSingleOnSub extends SuperClass {
  /**
   * Expected Output - should return @Foo(3) for both methods
   * JLS example 1.2-5
   */

  public static void main(String[] args) {
    Annotation[] actualAnnos1 = ContainerOnSuperSingleOnSub.class.getAnnotations();
    System.out.println("Output from getAnnotations()");
    System.out.println("Length of actual: " + actualAnnos1.length);
    System.out.println("Array contents: " );
    for( Annotation a : actualAnnos1) {
       System.out.println(a.toString());
    }
    Annotation[] actualAnnos2 = ContainerOnSuperSingleOnSub.class.getAnnotations(Foo.class);
    System.out.println("Output from getAnnotations(Foo.class)");
    System.out.println("Length of actual: " + actualAnnos2.length);
    System.out.println("Array contents: " );
    for( Annotation a : actualAnnos2) {
       System.out.println(a.toString());
    }
  }
}
