Не найдено унаследованных аннотаций в абстрактном суперклассе - PullRequest
2 голосов
/ 03 ноября 2011

Я создал унаследованную аннотацию типа поля, которая помещается в частные свойства в абстрактном суперклассе.

@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); всегда равно нулю.

Я как бы в растерянности - я не понимаю, почему, если я могу правильно извлечь поле (а также получить и установить его значение, например, не из соображений безопасности), я не вижу его аннотацию.

1 Ответ

2 голосов
/ 03 ноября 2011

Вместо этого:

Field[] fields = c.getFields();

попробуйте это:

Field[] fields = c.getDeclaredFields();

Если это не сработает, попробуйте перебрать объявленные аннотации:

for(Annotation annotation : field[i].getDeclaredAnnotations()) {
 ...
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...