Я создал унаследованную аннотацию типа поля, которая помещается в частные свойства в абстрактном суперклассе.
@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);
всегда равно нулю.
Я как бы в растерянности - я не понимаю, почему, если я могу правильно извлечь поле (а также получить и установить его значение, например, не из соображений безопасности), я не вижу его аннотацию.