Xét đoạn mã sau:Tại sao chú thích thiếu mất gây ra một ClassNotFoundException khi chạy?
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 các tác phẩm như mong đợi:
$ javac *.java
$ java -cp . C
[@A()]
Nhưng sau đó xem xét này:
$ rm A.class
$ java -cp . C
[]
Tôi đã dự kiến sẽ ném một số ClassNotFoundException
vì thiếu @A
. Nhưng thay vào đó, nó âm thầm giảm chú thích.
Hành vi này có được ghi lại trong JLS ở đâu đó không, hoặc đó có phải là một hoạt động không bình thường của JVM của Sun không? Lý do cho nó là gì?
Có vẻ như thuận tiện cho những thứ như javax.annotation.Nonnull
(có vẻ như nó đã là @Retention(CLASS)
), 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 xấu xảy ra khi chạy.
@Retention nằm trong java.lang.annotation - làm thế nào nó không có sẵn? –