У меня есть поле 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();
}
Я несколько раз компилировал проект чисто, процессор никогда не видит значений. Что я здесь упускаю? Процессор, очевидно, может видеть саму аннотацию, но переданные ему параметры скрыты.
BasicAnnotationProcessor
auto-common , намеренно избегая обработки неполных классов, пока они не будут готовы. - person Colin Alworth   schedule 16.03.2019annotation.toString()
просто выводит буквальную аннотацию, и не заботится о том, существует ли тип или где он находится. Но тип аннотации (и его методы), по-видимому, необходимы для определения переданных параметров (хотя я не понимаю, почему). ИспользованиеBasicAnnotationProcessor
для отсрочки обработки аннотаций решило проблему. - person Namnodorel   schedule 17.03.2019