처음에는 두 가지 종류의 주석이있었습니다. 런타임에 액세스 할 수 있고 (2 종류) 런타임에 액세스 할 수 없습니다. 주석의 동작은 주석 선언의 주석을 통해 보존 정책에 의해 수행됩니다. 예 :
@Retention(RetentionPolicy.RUNTIME) // effectively visible to JVM Runtime
public @interface MethodInfo {
String author() default "unspecified";
String lastModification() default "unspecified"; // Format: yyyy-mm-dd
ImplementationStatus implementationStatus();
}
JVM 런타임 표시 주석은 주석 코드 실행 (혹은 때 JVM이로드된다) 동안의 반사를 통해 액세스 될 수있다. 이러한 주석을 메타 데이터 소유자로 사용합니다. 메타 데이터는 다른 코드로 처리되어 다양한 작업을 수행 할 수 있습니다. 주어진 메소드가 실행되기 전에 주석 처리 된 메소드 구현 상태를 검사한다.
하지만 누군가는 반사를 통해 주석 matedata를 사용하는 코드를 작성해야합니다! 가장 좋은 예는 배치 된 JAR 파일로부터 요청시 클래스를로드하는 응용 프로그램 서버 (AS)입니다. 이는 특정 디렉토리입니다. AS는 @Initialization 주석으로 주석 처리 된 정적 메소드에 대해로드 된 각 클래스를 검사하는 코드를 포함 할 수 있으며 해당 메소드를 즉시 실행합니다. 이 주석 유형은 AS에 의해 정의되며 AS 용 JAR 및 클래스를 작성하는 사용자는 개발 중에이를 사용합니다.
런타임 중에 사용할 수없는 주석은 컴파일 중에 사용되며 해결됩니다. @Override가 좋은 예입니다. 사용자 정의 소스 전용 주석은 컴파일러 플러그인에서 사용하거나 필요에 따라 코드가 다른 코드에 의해 컴파일되는 경우 사용할 수 있습니다.
이 정보가 http://pawanz.wordpress.com/2010/12/12/taming-java-annotations/ – ashishjmeshram