2013-07-13 44 views
6

Tôi đã duyệt qua tài liệu của JDK 7 khi tôi nhận thấy chú thích được gọi là @Target trong gói java.lang.annotation. Tiêu đề của lớp đó làLàm cách nào để chú thích có thể là chú thích cho chính nó?

@Documented 
@Retention(value=RUNTIME) 
@Target(value=ANNOTATION_TYPE) 
public @interface Target 

Bây giờ, @Target được sử dụng làm chú thích cho chính nó. Sao có thể như thế được? @Target được sử dụng trong tiêu đề ngay cả trước khi nó được khai báo. Tôi đã thử điều này với các chú thích tôi đã viết và nó cũng hoạt động tốt. Bất cứ ai có thể giải thích những gì đang xảy ra ở đây?

+2

Tại sao nó không thể thực hiện được? Trình biên dịch có lẽ chỉ phân tích cú pháp lớp trước khi phân tích các chú thích của nó. Lưu ý rằng bạn cũng có thể có các lớp tự tham khảo (ví dụ như một cây đệ quy của các nút), –

+0

chú thích không làm bất cứ điều gì, bạn không nên ngoại trừ lỗi hoặc một cái gì đó mới với quy trình, chúng được sử dụng để phản ánh, ký một thành viên :) –

Trả lời

3

Các JLS đặc biệt dự kiến ​​này, trong section 9.6 Annotation Types:

Nếu chú thích a (§9.7) trên một khai báo kiểu chú thích tương ứng với một loại chú thích T, và T có (meta) chú thích m tương ứng với java.lang.annotation.Target, sau đó m phải có một phần tử có giá trị là java.lang.annotation.ElementType.ANNOTATION_TYPE hoặc một phần tử w giá trị ống là java.lang.annotation.ElementType.TYPE hoặc xảy ra lỗi biên dịch.

Không có phần nào khác của phần 9.6 hoặc 9.7 nói bất cứ điều gì về việc khai báo chú thích bất hợp pháp có liên quan đến chú thích được khai báo.

Các vấn đề liên quan