У меня есть поле VariableElement
, аннотированное сгенерированной аннотацией (поэтому я не могу использовать field.getAnnotation(annotationClass)
). Мне нужно получить все параметры, переданные этой аннотации.
Обратите внимание, что под «сгенерированной аннотацией» я подразумеваю, что буквально сам класс аннотации (а не аннотированный) был сгенерирован процессором аннотации. Аннотируемое поле / класс находится в рукописном исходном коде.
Не похоже, что это будет так сложно, до сих пор я придумал это:
for (AnnotationMirror annotation : field.getAnnotationMirrors()) {
Map<? extends ExecutableElement, ? extends AnnotationValue> annotationValueMap = annotation.getElementValues();
messager.printMessage(Diagnostic.Kind.WARNING, annotation.toString() + ":" + annotationValueMap.toString());
}
Я думал, что это сделает это, но вывод для поля следующий:
@MyAnnotation:{}
Итак, процессор распознает, что поле аннотировано, но я не могу получить доступ к переданным параметрам. Даже при том, что поле определенно аннотировано и передает параметры с аннотацией (это необходимо, поскольку аннотация определяет обязательные параметры и не имеет значений по умолчанию):
@MyAnnotation(max = 387, min = 66876, ...)
private Integer myField;
Вот сгенерированный код аннотации:
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.FIELD)
public @interface MyAnnotation {
int max();
boolean allowAuto();
int min();
}
Я несколько раз скомпилировал проект, процессор никогда не видит значения. Что я здесь пропускаю? Процессор, очевидно, может видеть саму аннотацию, но передаваемые ему параметры скрыты.