Могу ли я найти соответствующий MirrorAnnotation в кратчайшие сроки? - PullRequest
0 голосов
/ 01 мая 2019

Если я хочу, чтобы в среде 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)) 

не работает.

Можно ли как-то сравнивать классы, не превращая их в имена?

1 Ответ

0 голосов
/ 08 мая 2019

Я думаю, что вы просите представить в классе Types, и вы можете использовать isSameType метод, подобный этому

annotatedElement.getAnnotationMirrors()
                .stream()
                .filter(annotationMirror -> types.isSameType(annotationMirror.getAnnotationType(), elements.getTypeElement(annoClass.getCanonicalName()).asType()))
                .findFirst()
                .map(annotationMirror -> {
                    messager.printMessage(Diagnostic.Kind.ERROR, message, annotatedElement, annotationMirror);
                    return true;
                })
                .orElseGet(() -> {
                    messager.printMessage(Diagnostic.Kind.ERROR, message + " + no Annotation found.", annotatedElement);
                    return false;
                });

И вы не должны использовать строковые литералы, полученные из имен типов, для сравнения, как это, так как это может работать по-разному между intellij и eclipse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...