클래스나 인터페이스를 어떻게 처리해야할지 알려주는 정보
1. 컴파일 시 사용하는 정보 전달
2. 빌드툴이 코드를 자동으로 생성할때 사용하는 정보 전달
3. 특정 기능을 처리할때 사용하는 정보 전달
어노테이션은 하나의 타입이며 정의가 필요하다
/* 정의 */
public @interface AnnotationName {
...
}
/* 사용 */
@AnnotationName
...
어노테이션은 property 값을 받을 수 있다.
/* 정의 */
public @interface AnnotationName1 {
int prop1();
int prop2() default 1; // 기본값 지정
}
public @interface AnnotationNate2 {
int value(); // 기본 속성
}
/* 사용 */
@AnnotationName1(prop1=1, prop2=3);
...
@AnnotationName2(3);
...
어노테이션을 정의할 때, @Target 어노테이션을 적용하면 해당 어노테이션의 적용 대상 타입이 설정된다
/* 정의 */
@Target( { ElementType.TYPE, ElementType.FIELD, ... } )
public @interface AnnotationName { ... }
TYPE : 클래스, 인터페이스, 열거 타입
FIELD : 필드
CONSTRUCTOR : 생성자
METHOD : 메서드
PACKAGE : 패키지
LOCAL_VARIABLE : 로컬 변수
ANNOTATION_TYPE : 어노테이션
@Rentention 어노테이션을 적용하면 해당 어노테이션의 유지 수명이 설정된다
/* 정의 */
@Rentention( RententionPolicy.RUNTIME )
public @interface AnnotationName { ... }
SOURCE : 컴파일 시 적용 ~ 컴파일 후 제거
CLASS : 메모리에 로딩 시 적용 ~ 로딩 완료 후 제거
RUNTIME : 실행 시 적용 ~