2015-01-21 39 views
8

Khi truy cập Chú thích được xác định trên Trường thông qua Phản ánh (tức là sử dụng phương pháp getDeclaredAnnotations() : Annotation[]), đặc tả Java 6 hoặc 7 có đảm bảo về thứ tự mà Chú thích được trả về. Tôi đã kiểm tra các tài liệu java có liên quan nhưng dường như không thể tìm thấy một câu trả lời dứt khoát.Chú thích Phản chiếu Java Đặt hàng

+1

Tôi đã tự hỏi bản thân mình đặc biệt với java 8 @Repeatable –

+0

Tôi đã tự hỏi mình cùng một câu hỏi - tôi không thể tìm thấy bất kỳ tuyên bố rõ ràng cho đến nay. Bất kỳ tin tức về điều này? – mkurz

+1

@Adam Gent, @mkurz: ít nhất là cho các chú thích có thể lặp lại, có một số từ rõ ràng trong đặc điểm kỹ thuật, tôi đã tập hợp chúng lại với nhau. Họ thậm chí còn cho phép kết luận về câu hỏi ban đầu liên quan đến 'getDeclaredAnnotations()'. – Holger

Trả lời

9

Đó thực sự là một chút không xác định. Hãy bắt đầu với các tính năng Java 8 chú thích lặp lại như có một số bit về nó:

JLS §9.7.5. Multiple Annotations of the Same Type:

Chú thích ngầm tuyên bố được gọi là chú thích chứa, và chú thích nhiều loại T mà xuất hiện trong ngữ cảnh được gọi là chú thích cơ bản . Các phần tử của phần tử (array-typed) value của chú thích vùng chứa là tất cả chú thích cơ bản theo thứ tự từ trái sang phải, trong đó chúng xuất hiện trong ngữ cảnh.

Vì vậy, vùng chứa sẽ cung cấp chú thích lặp lại theo thứ tự.

Bên cạnh đó, tài liệu của AnnotatedElement quy định cụ thể:

Đối với một lời gọi get[Declared]AnnotationsByType(Class <T>), thứ tự của các chú thích đó là trực tiếp hoặc gián tiếp có mặt trên một yếu tố E được tính như nếu chú thích hiện gián tiếp trên E có mặt trực tiếp trên E thay cho chú thích vùng chứa của chúng theo thứ tự xuất hiện trong phần tử giá trị của chú thích vùng chứa.

Đưa hai này lại với nhau, nó ngụ ý rằng chú thích lặp đi lặp lại như @Foo(1) @Foo(2) @Foo(3) được lưu trữ như bạn đã viết @FooContainer({@Foo(1), @Foo(2), @Foo(3)}) và sau này, bất kể như thế nào nó ban đầu được tạo ra, sẽ được xử lý bởi getDeclaredAnnotations() như chú thích mặt trực tiếp của lệnh đó.

Vì vậy, câu trả lời cho chú thích lặp lại là thứ tự sẽ là “thứ tự từ trái sang phải mà chúng xuất hiện”.


Nhưng có một kết luận khác chúng tôi có thể rút ra từ tài liệu của AnnotatedElement. Vì nó cho biết thứ tự chú thích được tính như thể các chú thích gián tiếp có mặt trực tiếp thay cho chú thích vùng chứa, nó ngụ ý rằng nếu bạn viết @Foo(1) @FooContainer({@Foo(2), @Foo(3)}) hoặc @FooContainer({@Foo(1), @Foo(2)}) @Foo(3), thứ tự sẽ giống như các phần tử của vùng chứa sẽ thay thế nó giống như bạn đã viết @Foo(1) @Foo(2) @Foo(3).

Thật thú vị, how that is achieved:

Nếu chú thích của các loại chú thích annotationClass được tìm thấy là cả trực tiếp và trình bày gián tiếp, sau đó getDeclaredAnnotations() sẽ được gọi để xác định thứ tự của các yếu tố trong mảng được trả về.

Ghi chú triển khai này là chỉ báo đầu tiên trong toàn bộ tài liệu mà getDeclaredAnnotations() có thứ tự đáng tin cậy.Nó được sử dụng để xác định thứ tự được yêu cầu để hoàn thành hợp đồng được mô tả ở trên.

Vì vậy, câu trả lời là, có, getDeclaredAnnotations() cung cấp chú thích theo thứ tự được đảm bảo, nhưng thông tin đó không được đính kèm trực tiếp vào tài liệu của chính phương thức đó.

Điều này bắt nguồn từ tài liệu Java 8, nhưng kể từ khi Java 6 và 7 đạt đến kết thúc của cuộc sống ngay bây giờ và sẽ không thay đổi, thực tế là hành vi được quan sát thực hiện của chúng khớp với hành vi được đảm bảo ít nhất cho Java 8, có thể là đủ để dựa vào nó.

+1

Cảm ơn bạn rất nhiều thực sự cho câu trả lời của bạn cũng trình bày và toàn diện. –

+0

Cảm ơn câu trả lời chi tiết này! Đó là tuyên bố đầu tiên ở tất cả những gì tôi có thể tìm thấy rõ ràng và hợp lý mà trong đó chú thích thứ tự được lấy thông qua 'getDeclaredAnnotations()' - và tôi đã thực hiện khá nhiều nghiên cứu rồi ... Cảm ơn rất nhiều! – mkurz

+0

Tôi không nghĩ rằng bạn có thể dựa vào một gợi ý tinh tế không trực tiếp nêu rõ hợp đồng của phương pháp để giữ trật tự. Nếu đó là trường hợp đó là "ai đó chỉ quên đề cập đến nó trong tài liệu", điều này đã được sửa. Cho đến khi nó được đặt trong đá, mã hóa dựa trên giả định rằng nó sẽ ở lại như vậy trong tương lai có thể phá vỡ tính năng dựa trên chú thích của bạn. –

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