Получите имя включающего класса VariableElement в javax.annotation.processing.Processor - PullRequest
0 голосов
/ 15 мая 2019

Я только начинаю изучать обработку аннотаций в Java.У меня есть @MyAnnotation, который нацелен на ElementType.FIELD. В моем Processor я ограничиваю аннотацию разрешением только ненулевого уникального value.Который работает должным образом.

При ведении журнала ошибок в случае, если имеется какой-либо дубликат value, установленный на MyAnnotation.value, я хочу указать полный путь как существующих аннотаций в исходном коде, так иновый дубликат.

Моя аннотация:

@Retention(RetentionPolicy.RUNTIME)
@Target(value = ElementType.FIELD)
public @interface   ProviderColumn {
    String content_id();
}

Пример родительского класса.

public class EnclosingParent {
    @ProviderColumn(content_id="Hello")
    private String value1;

    @ProviderColumn(content_id="Hello")
    private String value2;
}

My AnnotationProcessor

@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment)
{
    UniqueColumnNameChecker columnNameChecker = new UniqueColumnNameChecker();

    try {

        for (Element annotatedElement : roundEnvironment.getElementsAnnotatedWith(ProviderColumn.class)) {

            // We can cast it, because we know that it is of ElementType.FIELD
            VariableElement variableElement = (VariableElement) annotatedElement;

            try {
                ProviderColumnId providerColumnId =
                        new ProviderColumnId(variableElement);

                // How can I get the EnclosingParent.class or even just a complete canonical class name?

                // throws a DuplicateAnnotationIdException when it detects duplicate entries.
                columnNameChecker.addAnnotationColumnName(providerColumnId);
            }
            catch (IllegalArgumentException e) {
                error(variableElement, e.getMessage());
                return true;
            }
        }
    }
    catch (DuplicateAnnotationIdException ex) {
        error(ex.getMessage());
        return true;
    }

    return true;
}

Однако у меня возникают проблемы с выяснением того, как получить информацию о классе из VariableElement.Так как я только начинаю с AnnotationProcessing, я даже не уверен, возможно ли это, и я не смог найти никаких вопросов, связанных с этой проблемой, в StackOverflow или где-либо еще.

Ожидаемая ошибка вывода

Duplicate content_id()='Hello' detected, Found at 'com.example.EnclosingParent.value1' and 'com.example.EnclosingParent.value2'.

Примечание: я понимаю, что могу получить информацию о родителе, если я определю новую аннотацию ElementType.TYPE и задаю класс Enclosing, но я стараюсь избегать этого, поскольку это добавляет дополнительные обязанности для третьегоучастник разработчик.

1 Ответ

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

глупый вопрос, видимо.Я искал во всех неподходящих местах для включающего элемента, нашел это превосходное Учебное пособие по процессору аннотаций , в котором говорится:

Elements и TypeMirrors

...

Вы можете думать об этом как о XML-файле, который вы пытаетесь проанализировать (или абстрактном синтаксическом дереве в конструкции компилятора)

И я понял, что Elementсамо по себе может содержать всю информацию, которая мне нужна.

Просто нужно позвонить variableElement.getEnclosingElement(), чтобы получить родителя Element

Оттуда это было легко, вы можете получить имя класса вложения, например, так:

element.getEnclosingElement().asType().toString();

Это, однако, не гарантирует, что ограждающий элемент имеет значение TypeElement.Так что просто используйте instanceof, чтобы убедиться, что это так.

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