import java.lang.annotation.* ;
import java.util.* ;
@Inherited
@Retention( RetentionPolicy.RUNTIME )
@interface Ann {
}
@Inherited
@Retention( RetentionPolicy.RUNTIME )
Ann[ ] value( ) ;
}
// Basic case. Result is that
// only @Ann("2") is present on
// ExhibitASub.
@Ann( "1" )
class ExhibitASuper {
}
@Ann( "2" )
class ExhibitASub extends ExhibitASuper {
}
// Because this case results in the
// @Container being present on ExhibitBSuper,
// rather than @Ann, all three annotations
// end up appearing on ExhibitBSub.
@Ann( "1" )
@Ann( "2" )
class ExhibitBSuper {
}
@Ann( "3" )
class ExhibitBSub extends ExhibitBSuper {
}
// Similar to the preceding case, by
// forcing the use of @Container, both
// annotations are present on ExhibitCSub.
class ExhibitCSuper {
}
@Ann( "2" )
class ExhibitCSub extends ExhibitCSuper {
}
// Yet when we force both to use @Container,
// only @Container(@Ann("2")) is present on
// ExhibitDSub.
class ExhibitDSuper {
}
class ExhibitDSub extends ExhibitDSuper {
}
class Main {
public static void main
( String [ ] args
) { for ( Class
<?> cls
: Arrays .
asList ( ExhibitASub.
class ,
ExhibitBSub.class ,
ExhibitCSub.class ,
ExhibitDSub.class ) ) {
System .
out .
printf ( "%s:%n" , cls
) ; System .
out .
printf ( " %s%n" , ann
) ; }
}
}
}
aW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLio7CmltcG9ydCBqYXZhLnV0aWwuKjsKCkBJbmhlcml0ZWQKQFJlcGVhdGFibGUoQ29udGFpbmVyLmNsYXNzKQpAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQpAaW50ZXJmYWNlIEFubiB7CglTdHJpbmcgdmFsdWUoKTsKfQoKQEluaGVyaXRlZApAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQpAaW50ZXJmYWNlIENvbnRhaW5lciB7CglBbm5bXSB2YWx1ZSgpOwp9CgovLyBCYXNpYyBjYXNlLiBSZXN1bHQgaXMgdGhhdAovLyBvbmx5IEBBbm4oIjIiKSBpcyBwcmVzZW50IG9uCi8vIEV4aGliaXRBU3ViLgpAQW5uKCIxIikKY2xhc3MgRXhoaWJpdEFTdXBlciB7Cn0KQEFubigiMiIpCmNsYXNzIEV4aGliaXRBU3ViIGV4dGVuZHMgRXhoaWJpdEFTdXBlciB7Cn0KCi8vIEJlY2F1c2UgdGhpcyBjYXNlIHJlc3VsdHMgaW4gdGhlCi8vIEBDb250YWluZXIgYmVpbmcgcHJlc2VudCBvbiBFeGhpYml0QlN1cGVyLAovLyByYXRoZXIgdGhhbiBAQW5uLCBhbGwgdGhyZWUgYW5ub3RhdGlvbnMKLy8gZW5kIHVwIGFwcGVhcmluZyBvbiBFeGhpYml0QlN1Yi4KQEFubigiMSIpCkBBbm4oIjIiKQpjbGFzcyBFeGhpYml0QlN1cGVyIHsKfQpAQW5uKCIzIikKY2xhc3MgRXhoaWJpdEJTdWIgZXh0ZW5kcyBFeGhpYml0QlN1cGVyIHsKfQoKLy8gU2ltaWxhciB0byB0aGUgcHJlY2VkaW5nIGNhc2UsIGJ5Ci8vIGZvcmNpbmcgdGhlIHVzZSBvZiBAQ29udGFpbmVyLCBib3RoCi8vIGFubm90YXRpb25zIGFyZSBwcmVzZW50IG9uIEV4aGliaXRDU3ViLgpAQ29udGFpbmVyKEBBbm4oIjEiKSkKY2xhc3MgRXhoaWJpdENTdXBlciB7Cn0KQEFubigiMiIpCmNsYXNzIEV4aGliaXRDU3ViIGV4dGVuZHMgRXhoaWJpdENTdXBlciB7Cn0KCi8vIFlldCB3aGVuIHdlIGZvcmNlIGJvdGggdG8gdXNlIEBDb250YWluZXIsCi8vIG9ubHkgQENvbnRhaW5lcihAQW5uKCIyIikpIGlzIHByZXNlbnQgb24KLy8gRXhoaWJpdERTdWIuCkBDb250YWluZXIoQEFubigiMSIpKQpjbGFzcyBFeGhpYml0RFN1cGVyIHsKfQpAQ29udGFpbmVyKEBBbm4oIjIiKSkKY2xhc3MgRXhoaWJpdERTdWIgZXh0ZW5kcyBFeGhpYml0RFN1cGVyIHsKfQoKY2xhc3MgTWFpbiB7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CgkJZm9yIChDbGFzczw/PiBjbHMgOiBBcnJheXMuYXNMaXN0KEV4aGliaXRBU3ViLmNsYXNzLAoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGhpYml0QlN1Yi5jbGFzcywKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhoaWJpdENTdWIuY2xhc3MsCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4aGliaXREU3ViLmNsYXNzKSkgewoJCQlTeXN0ZW0ub3V0LnByaW50ZigiJXM6JW4iLCBjbHMpOwoJCQlmb3IgKEFubm90YXRpb24gYW5uIDogY2xzLmdldEFubm90YXRpb25zKCkpIHsKCQkJCVN5c3RlbS5vdXQucHJpbnRmKCIgICAgJXMlbiIsIGFubik7CgkJCX0KCQkJCgkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwoJCX0KCX0KfQ==