다음 코드를 고려하십시오.
A.java :
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface A{}
C.java :
import java.util.*;
@A public class C {
public static void main(String[] args){
System.out.println(Arrays.toString(C.class.getAnnotations()));
}
}
컴파일 및 실행은 예상대로 작동합니다.
$ javac *.java
$ java -cp . C
[@A()]
그러나 다음을 고려하십시오.
$ rm A.class
$ java -cp . C
[]
가 누락 ClassNotFoundException되었기 때문에 나는 던질 것으로 예상했을 것 @A입니다. 그러나 대신 주석을 자동으로 삭제합니다.
이 동작이 JLS 어딘가에 문서화되어 있습니까, 아니면 Sun의 JVM의 특징입니까? 그 이유는 무엇입니까?
javax.annotation.Nonnull( @Retention(CLASS)어쨌든 그래야 할 것처럼 보임) 같은 일에 편리해 보이지만 다른 많은 주석의 경우 런타임에 여러 가지 나쁜 일이 발생할 수 있습니다.