어노테이션(annotaions)은 프로그램에 추가 정보를 제공하는데 사용됩니다.
어노테이션 타입 정의는 @interface를 사용하여 정의합니다.
public @interface MyAnnotation {
String name();
int age() default 0;
}
어노테이션은 엘리멘트(Element)라는 것을 멤버로 가질 수 있습니다. Element는 타입과 이름으로 구성되며 디폴트값을 가질 수 있습니다. 엘리먼트의 이름 뒤에는 메서드를 작성하는 것처럼 뒤에 ()를 꼭 붙여야 합니다.
@MyAnnotation(name="test")
@MyAnnotation(name="test", age=28)
기본 엘리멘트는 value이며 해당 값은 @어노테이션(값)으로 엘리멘트명을 생략할 수 있습니다.
public @interface MyAnnotation {
String value();
}
@MyAnotation("test")
@Target 어노테이션을 사용하여 어노테이션을 적용할 수 있는 범위를 지정할 수 있습니다.
@Target(value = { ElementType.FIELD , ElementType.METHOD })
public @interface MyAnnotation {
String value();
}
지정할 수 있는 범위는 java.lang.annotation.ElementType에 열거상수(Enum)으로 아래와 같이 정의되어있습니다.
TYPE : 클래스, 인터페이스, 열거 타입에 적용합니다.
ANNOTATION_TYPE : 어노테이션에 적용합니다.
FIELD : 필드에 적용합니다.
CONSTRUCTOR: 생성자에 적용합니다.
METHOD: 메서드에 적용합니다.
LOCAL_VARIABLE: 로컬 변수에 사용합니다.
PACKAGE: 패키지에 사용합니다.
@Retention 어노테이션을 사용하여 사용 용도에 따라 해당 어노테이션을 소스상에만 유지할 것인지
or 컴파일된 클래스까지 유지할 것인지
or 런타임 시에도 유지할 것인지
를 정의할 수 있습니다.
@Target({ ElementType.FIELD , ElementType.METHOD })
@Retention(RetentionPolicy.CLASS)
public @interface MyAnnotation {
String value();
}
해당 정책들은 java.lang.annotation.RetentionPolicy에 열거상수(Enum)으로 아래와 같이 정의되어있습니다.
SOURCE : 소스상에서만 어노테이션을 유지. class파일로 변경된 후에는 어노테이션 정보가 유지되지 않습니다. 주로 소스 코드를 분석에 사용되는 범위입니다.
CLASS : 바이트 코드에서도 어노테이션 정보를 유지하는 것입니다. RUNTIME과는 달리 리플렉션API를 이용해서 어노테이션 정보를 얻을 수는 없습니다.
RUNTIME : 리플렉션API를 이용해서 런타임시에도 어노테이션 정보를 얻을 수 있습니다.
java.lang.reflect.AnnotaionElement 인터페이스 내의 아래 메소드를 활용, 어노테이션 정보를 얻어 특정 작업을 수행하도록 할 수 있습니다.
isAnnotationPresent( Class<? extends Anotation> annotationClass )
: 지정한 어노테이션이 적용되었는지 여부를 boolean타입으로 리턴합니다. Class에서 호출했을 때 상위 클래스에 적용된 경우도 true를 리턴합니다.
getAnnotation( Class<T> annotationClass )
: 지정한 어노테이션이 적용되어 있으면 해당 어노테이션을 리턴하고 없을 시 null을 리턴합니다. 마찬가지로 상위 클래스에 적용되어도 같습니다.
getAnnotations()
: 적용된 모든 어노테이션을 Annotation[] 배열로 받습니다. 상위클래스도 포함합니다.
getDelaredAnnotations()
: 상위 클래스를 제외한 직접 적용된 어노테이션 배열을 리턴합니다.
출처