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

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

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;     
    }
}

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

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

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

Любые идеи

1 Ответ

10 голосов
/ 04 августа 2011

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

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%, что это геттер, так как вы не можете проверитьчто сделано внутри тела метода.Я предположил, что под «получателем» вы подразумевали метод, начинающийся с «get» и без параметров.

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

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