2011-11-03 70 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