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 で宣言されたフィールドが返されるB.findAnnotations()ことがわかります - 。たとえば、これらのフィールドの注釈は返されません。つまり、 を呼び出すとnull が返されます。getClass().getFields()fieldDelaredInBf.getAnnotations()f.getDeclaredAnnotations()

これは、派生クラスの属性に慣れていないスーパークラスの問題ですか? スーパークラスから呼び出したときに派生クラス DO のフィールドが表示されるという事実を考えると、奇妙に思え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 に答える