2

在我的 Android 应用程序中,我有以下类:

public abstract class A implements IA {
    private void findAnnotations() {
        Field[] fields = getClass().getFields();

        // Get all fields of the object annotated for serialization
        if (fields != null && fields.length > 0) {
            for (Field f : fields) {
                Annotation[] a = f.getAnnotations();

                if (annotation != null) {
                    // Do something
                }
            }
        }

        return serializationInfoList
                .toArray(new SoapSerializationFieldInfo[serializationInfoList
                        .size()]);
    }
}

public abstract class B extends A {
    @MyAnnotation(Name="fieldDelaredInB")
    public long fieldDelaredInB;
}

当我调用时B.findAnnotations(),我可以看到getClass().getFields()返回在 B - 中声明的字段fieldDelaredInB,例如,但没有返回这些字段的注释 - 即,当我调用时,我得到 null f.getAnnotations()f.getDeclaredAnnotations()或其他任何情况。

这是不熟悉派生类属性的超类的问题吗?考虑到派生类的字段在我getFields()从超类调用时出现的事实,这似乎很奇怪。

关于我错过了什么的任何想法?

谢谢,哈雷尔

4

2 回答 2

6

除非使用 标记为运行时保留,否则不会在运行时加载注释@Retention(RetentionPolicy.RUNTIME)。您必须将此@Retention注释放在@MyAnnotation注释上:

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    ...
}
于 2012-06-12T22:19:23.280 回答
2

反而

if (annotation != null) {
    // Do something
}

你应该有

if (a != null) {
    //do something
}

此外,如果您搜索所需的注释会更快,如下所示:

Annotation a = f.getAnnotation(MyAnnotation.class);
于 2012-06-12T22:11:44.520 回答