2011-11-03 54 views
2

我創建了一個放置在抽象超類中的私有屬性上的繼承的字段類型註釋。未找到抽象超類上的繼承註釋

@Inherited 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface Lifecycle{ 
    Type type(); 
    String name() default ""; 

    public enum Type{ 
     DISCRIMINATOR,INITIAL,MUTABLE 
    } 
} 

我打電話從中尋求收集這種類型的(遺傳或其他方式)的所有註釋並以列表返回它們的子類中的方法。

public static <T extends Annotation> List<T> getAnnotation(final Class c, final Class<T> ann) { 
    return getAnnotation(c, ann, new ArrayList<T>()); 
} 

public static <T extends Annotation> List<T> getAnnotation(final Class c, final Class<T> ann, List<T> aList) { 
    Field[] fields = c.getFields(); 
    for (int i = 0; i < fields.length; i++) { 
     Field myField = fields[i]; 
     myField.setAccessible(true); 
     T found = myField.getAnnotation(ann); 
     if (found != null) { 
      aList.add(found); 
     } 
    } 
    if (!c.getSuperclass().equals(Object.class)) { 
     return getAnnotation(c.getSuperclass(), ann, aList); 
    } else { 
     return aList; 
    } 
} 

由於某種原因,我不知道這是行不通的。所有領域都繼承,而不是肯定找到。同樣,遍歷繼承結構中的所有類,但由於某種原因,myField.getAnnotation(ann);始終爲空。

我有點茫然 - 我不明白爲什麼如果我可以正確地檢索字段(以及獲取和設置它的價值,例如不是安全事物),我看不到它的註釋。

回答

2

取而代之的是一個:

Field[] fields = c.getFields(); 

試試這個:

Field[] fields = c.getDeclaredFields(); 

如果這不起作用,嘗試遍歷聲明註釋:

for(Annotation annotation : field[i].getDeclaredAnnotations()) { 
... 
} 
+0

第一種方法工作(使用c.getDeclaredFields()。你知道這是爲什麼嗎? – jpredham

+0

你的解決方案不工作,導致clazz.getFields()返回公共可訪問的字段,但clazz.getDeclaredFields()返回所有字段。檢查javadoc的更多信息;) – WeMakeSoftware