====== Java Annotation ======
* [[http://en.wikibooks.org/wiki/Java_Programming/Annotations|Java Annotations]]
* [[http://www.javacodegeeks.com/2014/11/java-annotations-tutorial.html|Java Annotation Tutorial]]
* [[https://dzone.com/articles/all-java-built-in-annotation-examples|All Java Built-In Annotation Examples]]
* [[java:jandex|jandex]]
===== Meta Annotation =====
* [[http://en.wikibooks.org/wiki/Java_Programming/Annotations/Meta-Annotations|Java Meta Annotations]]
==== @Inherited ====
@Inherited
@interface ForEveryone { }
@interface JustForMe { }
@ForEveryone
@JustForMe
class Superclass { }
class Subclass extends Superclass { }
위와 같은 코드에서 ''@Inherited''가 적용된 ''@ForEveryone'' 어노테이션을 Superclass에만 지정했지만 자동으로 그 서브클래스인 Subclass에도 적용된 것으로 간주된다. 그에 반해 ''@JustForMe''는 Subclass로 상속되지 않는다.
===== Annotation 객체 생성하기 instanciation of annotation =====
==== 어노테이션은 인터페이스다! ====
* 어노테이션은 기본적으로 인터페이스이다.
* 인터페이스는 implements 로 구현 클래스를 만든뒤에 객체를 생성해주면 된다. 그걸로 끝!
*
// 아래와 같은 어노테이션이 있을 때!
@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;
}
}
==== 어노테이션을 직접 지정한 뒤에 Reflection으로 생성하기 - 복잡하므로 하지 말 것 ====
* [[http://stackoverflow.com/questions/266903/create-annotation-instance-with-defaults-in-java|Create Annotation instance with defaults, in Java]]
* [[http://docs.jboss.org/cdi/api/1.0/javax/enterprise/util/AnnotationLiteral.html|AnnotationLiteral (CDI APIs 1.0 API)]]
* 내가 만들어본 어노테이션 객체 생성하기 MyAnn이 required 항목을 가진 어노테이션일 경우
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
}