2013-05-03 36 views
7

Searchable.javagetAnnotations Reflection() trả về null

@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Searchable { } 

Obj.java

public class Obj { 
    @Searchable 
    String myField; 
} 

void main (String [] args)

Annotation[] annotations = Obj.class.getDeclaredField("myField").getAnnotations(); 

Tôi mong đợi annotations sẽ chứa số @Searchable của tôi. Mặc dù nó là null. Theo tài liệu, phương pháp này:

Trả về tất cả chú thích có trên phần tử này. (Trả về một mảng có độ dài bằng không nếu phần tử này không có chú thích.) Người gọi của phương thức này là miễn phí để sửa đổi mảng được trả về; nó sẽ không ảnh hưởng đến các mảng được trả lại cho những người gọi khác.

Điều gì thậm chí còn kỳ lạ hơn (với tôi), vì nó trả về null thay vì Annotation[0].

Tôi đang làm gì sai ở đây và quan trọng hơn, làm cách nào để tôi có thể nhận được Annotation của mình?

+3

Dường như hoạt động trên máy của tôi. Phiên bản Java bạn đang sử dụng khi chạy là gì? Bạn có thể kiểm tra dòng '@Retention (RetentionPolicy.RUNTIME)' không tồn tại trên chú thích tùy chỉnh của bạn không? Làm thế nào để bạn biết nó trả về 'null'? Bạn có thể cung cấp đoạn mã bạn đang sử dụng không? – sp00m

+1

Chính xác. Làm việc với JDK 1.7.0. –

+0

@ sp00m Tôi đã sao chép từ IDE, RUNTIME có sẵn. Tôi biết nó trả về null kể từ khi tôi gỡ lỗi nó. Tôi đang sử dụng JDK 1.7.0. – Aquillo

Trả lời

5

tôi chỉ thử nghiệm này cho bạn, và nó chỉ hoạt động:

public class StackOverflowTest { 

    @Test 
    public void testName() throws Exception { 

     Annotation[] annotations = Obj.class.getDeclaredField("myField").getAnnotations(); 

     System.out.println(annotations[0]); 
    } 
} 

@Target(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
@interface Searchable { 

} 

class Obj { 

    @Searchable 
    String myField; 
} 

tôi chạy nó, và nó tạo ra kết quả như sau:

@nl.jworks.stackoverflow.Searchable() 

Bạn có thể thử chạy các lớp trên trong của bạn IDE? Tôi đã thử nó với IntelliJ, openjdk-6.

+0

Điều này hoạt động, cảm ơn. Sẽ kiểm tra vấn đề hơn nữa, sẽ cho bạn biết. – Aquillo

+1

Tôi dường như không thể tái tạo vấn đề của mình, nhưng vấn đề được giải quyết bằng cách sao chép ví dụ của bạn và xây dựng nó trở lại trường hợp của tôi, cảm ơn Erik! – Aquillo

+0

Chắc chắn, không có vấn đề, vui vì tôi có thể giúp! –

2

Mã của bạn là chính xác. Vấn đề là ở một nơi khác. Tôi chỉ cần sao chép và chạy mã của bạn và nó hoạt động.

Có thể bạn nhập sai lớp Obj trong mã của mình mà bạn có thể muốn kiểm tra trước tiên.