java - 在抽象父类(super class)上找不到继承的注释

标签 java inheritance annotations

我创建了一个继承的字段类型注释,它放置在抽象父类(super class)中的私有(private)属性上。

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

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

最佳答案

而不是这个:

Field[] fields = c.getFields();

试试这个:

Field[] fields = c.getDeclaredFields();

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

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

关于java - 在抽象父类(super class)上找不到继承的注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7999516/

相关文章:

java - 如何在 Spring Web 应用程序中为同一 View 组合 GET 和 POST HTTP 方法?

java - 如何找到包含类定义的jar文件?

java - 从 Java 应用程序交互智能合约

java - 霍夫曼获取树高

具有相同数据结构的 C++ 类

java - JUnit 自定义注解

java - 适用于 Android 和 iPhone 的问卷

java - 继承和抽象参数传递

c# - 覆盖 ComboBox.Items 的最佳方式

java - 使用 JDT 将注释附加到类