Если я хочу, чтобы в среде IDE была ошибка обработки аннотации на самой аннотации, я должен использовать следующую форму printMessage ():
printMessage(Diagnostic.Kind kind, CharSequence msg, Element e, AnnotationMirror a)
Но я не могу найти хороший и простой способ получить это AnnotationMirror.
Используя примеры кода, эти и эти , комбинируя то, что я там нашел, я нашел сложный способ:
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
Set<? extends Element> classesForBuilder = roundEnv.getElementsAnnotatedWith(AddBuilder.class);
for(Element classElement : classesForBuilder){
if (classElement.getModifiers().contains(Modifier.ABSTRACT)) {
return annoError(classElement, "AnnoBuilder cannot be applied to an abstract class.", AddBuilder.class);
.......
boolean annoError(Element annotatedElement, String message, Class<? extends Annotation> annoClass ){
for(AnnotationMirror annotationMirror : annotatedElement.getAnnotationMirrors()){
>>>>>>>>if(((TypeElement)annotationMirror.getAnnotationType().asElement())
.getQualifiedName().toString()
.equals( annoClass.getCanonicalName())) {
messager.printMessage(Kind.ERROR, message, annotatedElement, annotationMirror);
} else {
messager.printMessage(Kind.ERROR, message+" + no Annotation found.", annotatedElement);
}
}
return true;
}
Это работает. Но мне не нравится действительно страшная секунда if
.
Я нашел более короткий способ сравнения через строку:
if(annotationMirror.getAnnotationType().toString().equals(annoClass.getCanonicalName()))
Я не понимаю, почему во всех опубликованных примерах используется только этот сверхдлинный способ сравнения во многих классах.
Но все же я хотел бы, чтобы оно было короче.
if(annotationMirror.getAnnotationType().equals(annoClass))
не работает.
Можно ли как-то сравнивать классы, не превращая их в имена?