SOURCE는 컴파일러가 사용하는 애너테이션을 뜻한다. 컴파일러를 직접 작성할 것이 아니면 쓸 일 없다.
RUNTIME은 실행 시에 reflection을 통해 클래스 파일에 저장된 애너테이션 정보를 읽어서 처리할 수 있다.
CLASS는 컴파일러가 애너테이션 정보를 클래스 파일에 저장할 수 있게는 하지만, 클래스 파일이 JVM에 로딩될 때는 애너테이션의 정보가 무시되어 실행 시에 애너테이션에 대한 정보를 얻을 수 없다. 그래서 잘 안 쓴다.
@Documented
애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 한다.
@Inherited
애너테이션이 자손 클래스에 상속되도록 한다.
애너테이션 요소의 규칙
@interface AnnoTest {
int id = 100; // OK. 상수 선언. static final int id = 100;
String major(int i, int j); // 에러. 매개변수를 선언할 수 없음
String minor() throws Exception; // 에러. 예외를 선언할 수 없음
ArrayList<T> list(); // 에러. 요소의 타입에 타입 매개변수 사용불가