Bất cứ ai có thể giải thích một cách rõ ràng sự khác biệt thực tiễn giữa các java.lang.annotation.RetentionPolicy
hằng số SOURCE
, CLASS
và RUNTIME
?
Tôi cũng không chắc chắn chính xác cụm từ "giữ lại chú thích" nghĩa là gì.
Bất cứ ai có thể giải thích một cách rõ ràng sự khác biệt thực tiễn giữa các java.lang.annotation.RetentionPolicy
hằng số SOURCE
, CLASS
và RUNTIME
?
Tôi cũng không chắc chắn chính xác cụm từ "giữ lại chú thích" nghĩa là gì.
Câu trả lời:
RetentionPolicy.SOURCE
: Hủy trong quá trình biên dịch. Các chú thích này không có ý nghĩa gì sau khi quá trình biên dịch hoàn thành, vì vậy chúng không được ghi vào mã byte.
Ví dụ:@Override
,@SuppressWarnings
RetentionPolicy.CLASS
: Hủy trong khi tải lớp. Hữu ích khi thực hiện xử lý hậu kỳ cấp mã byte. Thật đáng ngạc nhiên, đây là mặc định.
RetentionPolicy.RUNTIME
: Đừng bỏ đi. Chú thích nên có sẵn để phản ánh trong thời gian chạy. Thí dụ:@Deprecated
Nguồn:
URL cũ đã chết
hunter_meta và được thay thế bằng hunter-meta-2-098036 . Trong trường hợp ngay cả điều này đi xuống, tôi đang tải lên hình ảnh của trang.
Hình ảnh (Nhấp chuột phải và chọn 'Mở hình ảnh trong tab / cửa sổ mới')
RetentionPolicy.CLASS
apt
không được dùng nữa, hãy tham khảo tài liệu này.oracle.com / javase / 7 / docs / technotes / guide /apt / . Để khám phá chú thích bằng cách sử dụng sự phản chiếu, có nhiều hướng dẫn trên internet. Bạn có thể bắt đầu bằng cách xem xét java.lang.Class::getAnno*
và các phương pháp tương tự trong java.lang.reflect.Method
và java.lang.reflect.Field
.
Theo ý kiến của bạn về dịch ngược lớp, đây là cách tôi nghĩ nó nên hoạt động:
RetentionPolicy.SOURCE
: Sẽ không xuất hiện trong lớp dịch ngược
RetentionPolicy.CLASS
: Xuất hiện trong lớp dịch ngược, nhưng không thể được kiểm tra tại thời điểm chạy với sự phản chiếu với getAnnotations()
RetentionPolicy.RUNTIME
: Xuất hiện trong lớp dịch ngược và có thể được kiểm tra tại thời điểm chạy với sự phản chiếu với getAnnotations()
Ví dụ runnable tối thiểu
Trình độ ngôn ngữ :
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.SOURCE)
@interface RetentionSource {}
@Retention(RetentionPolicy.CLASS)
@interface RetentionClass {}
@Retention(RetentionPolicy.RUNTIME)
@interface RetentionRuntime {}
public static void main(String[] args) {
@RetentionSource
class B {}
assert B.class.getAnnotations().length == 0;
@RetentionClass
class C {}
assert C.class.getAnnotations().length == 0;
@RetentionRuntime
class D {}
assert D.class.getAnnotations().length == 1;
}
Mức mã byte : sử dụng javap
chúng tôi quan sát rằng Retention.CLASS
lớp chú thích có thuộc tính lớp RuntimeInvisible :
#14 = Utf8 LRetentionClass;
[...]
RuntimeInvisibleAnnotations:
0: #14()
trong khi Retention.RUNTIME
chú thích có một thuộc tính lớp RuntimeVisible :
#14 = Utf8 LRetentionRuntime;
[...]
RuntimeVisibleAnnotations:
0: #14()
và Runtime.SOURCE
chú thích .class
không nhận được bất kỳ chú thích nào.
Ví dụ về GitHub để bạn chơi.
Chính sách duy trì: Chính sách duy trì xác định tại thời điểm chú thích bị loại bỏ. Nó được chỉ định bằng cách sử dụng các chú thích dựng sẵn của Java: @Retention
[Giới thiệu]
1.SOURCE: annotation retained only in the source file and is discarded
during compilation.
2.CLASS: annotation stored in the .class file during compilation,
not available in the run time.
3.RUNTIME: annotation stored in the .class file and available in the run time.