Как получить тело метода из ExecutableElement

В моемAbstractProcessor Я могу получить все методы из класса с аннотацией, которую я создал:

List<? extends Element> allElements = processingEnv.getElementUtils().getAllMembers((TypeElement) bean);
List<ExecutableElement> methods = ElementFilter.methodsIn(allElements);

Возможно ли получить тело метода /ExecutableElement? Похоже, API имеет дело только с сигнатурой и модификаторами.

Я мог бы, вероятно, использовать некоторые варианты этого ответа:https://stackoverflow.com/a/34568708/6095334, чтобы получить доступ к классам из проприетарного пакета * .sun. **, такого какcom.sun.tools.javac.tree.JCTree$MethodTree:

MethodTree methodTree = trees.getTree(executableElement);

гдеtrees является примеромcom.sun.source.util.Trees установить в методе init () AbstractProcessor следующим образом:trees = Trees.instance(processingEnv);
Но эти классы идут с предупреждением:Это НЕ является частью какого-либо поддерживаемого API. Если вы пишете код, который зависит от этого, вы делаете это на свой страх и риск. Этот код и его внутренние интерфейсы могут быть изменены или удалены без предварительного уведомления.

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

Ответы на вопрос(1)

Насколько мне известно, структура аннотации не поддерживает доступ кExecutableElementТело Было бы заманчиво позвонитьgetEnclosedElements(), но, как утверждает Javadoc:

Возвращает элементы, которые, прямо говоря, непосредственно заключены в этот элемент. Считается, что класс или интерфейс включают поля, методы, конструкторы и типы членов, которые он непосредственно объявляет. Пакет включает в себя классы верхнего уровня и интерфейсы внутри него, но не считается включающим подпакеты. Другие виды элементов в настоящее время не считаются включающими какие-либо элементы; однако это может измениться по мере развития этого API или языка программирования.

Для моего проекта мне удалось извлечь нужную информацию из тела метода следующим образом:

MethodTree methodTree = trees.getTree(executableElement);
BlockTree blockTree = methodTree.getBody();
for (StatementTree statementTree : blockTree.getStatements()) {
  // *do something with the statements*
}

гдеcom.sun.source.util.Trees trees = Trees.instance(processingEnv); это поле экземпляра, которое я установил вAbstractProcessor«sinit() метод.

Посмотрите этот ответ, для получения информации о зависимости от упомянутых классов инструментов jdk:https://stackoverflow.com/a/29585979/6095334

 Tagc24 окт. 2018 г., 17:25
Я пробовал это с kapt (обработка аннотаций Kotlin), но для каждой функции он дает только 1 утверждение (return <default value for return type>) или 0 операторов, если функция возвращает Unit (void).

Ваш ответ на вопрос