Могу ли я перейти от TypeVariable или VariableElement к списку методов базового класса в процессоре аннотаций во время компиляции

У меня есть аннотированный класс:

public class CacheMessageHolder<TestMessage> implements MessageHolder<TestMessage> {
    protected @MessageHolderType TestMessage message;
    @Override
    @SendProtoAll (proto ="protoMessageClass", matchType=MatchType.PARTIAL)
    public void setMessage( TestMessage msg) {
        this.message = msg;     
    }
}

В моем обработчике аннотаций я хочу получить список методов получения объекта Object, переданных в метод setMessage, и эта информация будет затем использована для генерации кода.

Я расширяю ElementScanner6 и получаю VariableElement, который, кажется, содержит параметр, но я не знаю, куда идти дальше.

Поэтому в этом примере я хочу получить все методы класса TestMessage во время компиляции.

Есть идеи

1 ответ

Решение

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

VariableElement parameterElement;
ProcessingEnvironment processingEnv;

TypeMirror parameterType = parameterElement.asType();
Types typeUtils = processingEnv.getTypeUtils();
TypeElement typeElement = (TypeElement) typeUtils.asElement(parameterType);
Elements elementUtils = processingEnv.getElementUtils()
List<? extends Element> elementMembers = elementUtils.getAllMembers(typeElement);
List<ExecutableElement> elementMethods = ElementFilter.methodsIn(elementMembers);
for(ExecutableElement methodElement : elementMethods) {
    if (methodElement.getParameters().size()==0 && methodElement.getSimpleName().toString().startsWith("get")) {
      // do something
    }
}

Я думаю, что это должно работать, но я не уверен на 100%, что это геттер, так как вы не можете проверить, что сделано внутри тела метода. Я предположил, что под "getter" вы подразумевали метод, начинающийся с "get" и не имеющий параметров.

Это отвечает на ваш вопрос?

Другие вопросы по тегам