====== 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 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 }