【问题标题】:Not finding Inherited annotations on Abstract Superclass在抽象超类上找不到继承的注释
【发布时间】:2011-11-03 17:46:33
【问题描述】:

我创建了一个继承的字段类型注释,它放置在抽象超类的私有属性上。

@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); 始终为空。

我有点不知所措 - 我不明白为什么如果我可以正确检索我看不到它的注释的字段(以及获取和设置它的值,例如不是安全的东西)。

【问题讨论】:

    标签: java inheritance annotations


    【解决方案1】:

    而不是这个:

    Field[] fields = c.getFields();
    

    试试这个:

    Field[] fields = c.getDeclaredFields();
    

    如果这不起作用,请尝试迭代声明的注释:

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

    【讨论】:

    • 第一种方法有效(使用 c.getDeclaredFields()。你知道这是为什么吗?
    • 您的解决方案不起作用,因为 clazz.getFields() 返回公共可访问字段,但 clazz.getDeclaredFields() 返回所有字段。查看 javadoc 了解更多信息;)
    猜你喜欢
    • 2014-02-19
    • 1970-01-01
    • 2012-05-16
    • 2023-01-19
    • 2012-05-20
    • 2017-12-23
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多