2013-05-16 39 views
38

tôi tạo chú thích của tôiLấy danh sách các lĩnh vực với chú thích, bằng cách sử dụng phản ánh

public @interface MyAnnotation { 
} 

tôi đặt nó trên các lĩnh vực trong đối tượng thử nghiệm của tôi

public class TestObject { 

    @MyAnnotation 
    final private Outlook outlook; 
    @MyAnnotation 
    final private Temperature temperature; 
    ... 
} 

Bây giờ tôi muốn để có được danh sách tất cả các lĩnh vực với MyAnnotation.

for(Field field : TestObject.class.getDeclaredFields()) 
{ 
    if (field.isAnnotationPresent(MyAnnotation.class)) 
     { 
       //do action 
     } 
} 

Nhưng có vẻ như khối của tôi làm hành động không bao giờ được thực hiện, và các lĩnh vực không có chú thích như đoạn mã sau trả về 0.

TestObject.class.getDeclaredField("outlook").getAnnotations().length; 

Có ai có thể giúp tôi và cho tôi biết những gì tôi đang làm sai rồi?

+0

1) Để được trợ giúp tốt hơn sớm hơn, gửi một [SSCCE] (http://sscce.org/). 2) Vui lòng thêm một chữ cái hoa ở đầu câu. Cũng sử dụng vốn cho từ I & tên thích hợp như Java, và các từ viết tắt và từ viết tắt như JEE hoặc WAR. Điều này giúp mọi người hiểu và giúp đỡ dễ dàng hơn. –

+0

có thể trùng lặp của [Cách nhận chú thích của biến thành viên?] (Http://stackoverflow.com/questions/4453159/how-to-get-annotations-of-a-member-variable) – fglez

Trả lời

54

Bạn cần đánh dấu chú thích là có sẵn khi chạy. Thêm phần sau vào mã chú thích của bạn.

@Retention(RetentionPolicy.RUNTIME) 
public @interface MyAnnotation { 
} 
+0

Chính xác. Nhưng, tôi nghĩ rằng chú thích là để sử dụng thời gian chạy. – wrivas

+3

@wrivas Không phải tất cả các chú thích đều dành cho thời gian chạy. Ví dụ '' SuppressWarnings' là RetentionPolicy.SOURCE vì nó chỉ là một gợi ý cho trình biên dịch để không cảnh báo về những thứ nhất định. – Patrick

+0

Chú thích chỉ dành cho Nguồn (để bạn đọc), Biên dịch thời gian hoặc Thời gian chạy –

6
/** 
* @return null safe set 
*/ 
public static Set<Field> findFields(Class<?> classs, Class<? extends Annotation> ann) { 
    Set<Field> set = new HashSet<>(); 
    Class<?> c = classs; 
    while (c != null) { 
     for (Field field : c.getDeclaredFields()) { 
      if (field.isAnnotationPresent(ann)) { 
       set.add(field); 
      } 
     } 
     c = c.getSuperclass(); 
    } 
    return set; 
} 
+11

Apache Commons có chức năng này: FieldUtils.getFieldsListWithAnnotation (...) – DBK

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