Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在抽象超类上找不到继承的注释_Java_Inheritance_Annotations - Fatal编程技术网

Java 在抽象超类上找不到继承的注释

Java 在抽象超类上找不到继承的注释,java,inheritance,annotations,Java,Inheritance,Annotations,我创建了一个继承的字段类型注释,它位于抽象超类中的私有属性上 @Inherited @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Lifecycle{ Type type(); String name() default ""; public enum Type{ DISCRIMINATOR,INITIAL,MUTABLE } }

我创建了一个继承的字段类型注释,它位于抽象超类中的私有属性上

@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;
    }
}
公共静态列表getAnnotation(最终类c,最终类ann){
返回getAnnotation(c,ann,newArrayList());
}
公共静态列表getAnnotation(最终类c、最终类ann、列表列表列表){
Field[]fields=c.getFields();
for(int i=0;i
不知什么原因,这不起作用。所有字段(包括继承字段和非继承字段)都会被明确找到。同样地,继承结构中的所有类都被遍历,但出于某种原因,
myField.getAnnotation(ann)始终为空

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

而不是这个:

Field[] fields = c.getFields();
试试这个:

Field[] fields = c.getDeclaredFields();
如果这不起作用,请尝试迭代声明的注释:

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

第一个方法有效(使用c.getDeclaredFields()。您知道为什么吗?您的解决方案不起作用,因为clazz.getFields()返回公共可访问的字段,但clazz.getDeclaredFields()返回所有字段。有关详细信息,请查看javadoc;)