@Inherited @interface ForEveryone { } @interface JustForMe { } @ForEveryone @JustForMe class Superclass { } class Subclass extends Superclass { }
위와 같은 코드에서 @Inherited
가 적용된 @ForEveryone
어노테이션을 Superclass에만 지정했지만 자동으로 그 서브클래스인 Subclass에도 적용된 것으로 간주된다. 그에 반해 @JustForMe
는 Subclass로 상속되지 않는다.
// 아래와 같은 어노테이션이 있을 때! @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LoginUser { boolean required() default true; SomeValue [] someValues() default {}; } // 아래와 같이 클래스로 구현한 뒤에 해당 클래스의 인스턴스를 생성하면 된다. public static class FakeLoginUser implements LoginUser { private boolean requiredValue = true; private SomeValue[] someValueValue = {}; public FakeLoginUser(boolean requiredValue, SomeValue[] someValueValue) { this.requiredValue = requiredValue; this.someValueValue = someValueValue; } @Override public Class<? extends Annotation> annotationType() { return LoginUser.class; } @Override public boolean required() { return requiredValue; } @Override public SomeValue[] someValue() { return someValueValue; } }
private MyAnn requiredTrueMyAnn; private MyAnn requiredFalseMyAnn; public void myAnnSupports(@MyAnn Object requiredTrueObject, @MyAnn(required = false) Object requiredFalseObject) throws SecurityException, NoSuchMethodException { Annotation[][] parameterAnnotations = this.getClass() .getMethod("myAnnSupports", Object.class, Object.class).getParameterAnnotations(); requiredTrueMyAnn= parameterAnnotations[0][0]; // requiredTrueMyAnn.required() == true requiredFalseMyAnn= parameterAnnotations[1][0]; // requiredFalseMyAnn.required() == false }