Perhatikan kode berikut:
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()));
}
}
Mengompilasi dan menjalankan berfungsi seperti yang diharapkan:
$ javac *.java
$ java -cp . C
[@A()]
Tapi kemudian pertimbangkan ini:
$ rm A.class
$ java -cp . C
[]
Saya akan mengharapkannya untuk melempar ClassNotFoundException
, karena @A
hilang. Namun, sebaliknya, anotasi akan dihapus secara diam-diam.
Apakah perilaku ini didokumentasikan di JLS di suatu tempat, atau ini merupakan kekhasan dari JVM Sun? Apa alasannya?
Tampaknya nyaman untuk hal-hal seperti javax.annotation.Nonnull
(yang sepertinya memang seharusnya demikian @Retention(CLASS)
), tetapi untuk banyak anotasi lainnya sepertinya hal itu dapat menyebabkan berbagai hal buruk terjadi pada waktu proses.