Hãy xem xét đoạn mã sau:
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()));
}
}
Biên dịch và chạy hoạt động như mong đợi:
$ javac *.java
$ java -cp . C
[@A()]
Nhưng sau đó hãy xem xét điều này:
$ rm A.class
$ java -cp . C
[]
Tôi đã mong đợi nó ném một ClassNotFoundException
, vì đã @A
mất tích. Nhưng thay vào đó, nó âm thầm bỏ chú thích.
Hành vi này có được ghi lại trong JLS ở đâu đó không, hay nó chỉ là một trò lố của JVM của Sun? Cơ sở lý luận của nó là gì?
Nó có vẻ thuận tiện cho những thứ như javax.annotation.Nonnull
(có vẻ như @Retention(CLASS)
dù sao thì nó cũng nên như vậy ), nhưng đối với nhiều chú thích khác, có vẻ như nó có thể gây ra nhiều điều tồi tệ khác nhau xảy ra trong thời gian chạy.