2016-07-29 3 views
3

에서 메소드 본문을 얻는 방법, 내가 만든 : 이 좀 주석이 클래스의 모든 방법을 얻을 수 있어요 내 <code>AbstractProcessor</code>에서 ExecutableElement

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

인가

이 방법의 몸을 얻을 수 있습니다/ ExecutableElement? API는 서명 및 수정 자만 처리하는 것 같습니다.

아마이 답변의 일부 변화 사용할 수

:. 독점 * .sun에서 액세스 클래스, https://stackoverflow.com/a/34568708/6095334을 ** 패키지 등 com.sun.tools.javac.tree.JCTree$MethodTree 같은 : treescom.sun.source.util.Trees 세트의 인스턴스입니다

MethodTree methodTree = trees.getTree(executableElement); 

AbstractProcessor의 init() 메소드는 다음과 같습니다 : trees = Trees.instance(processingEnv);
그러나이 클래스에는 경고 메시지가 있습니다 : 이것은 지원되는 API의 일부가 아닙니다. 이것에 의존하는 코드를 작성하면, 스스로 위험을 감수해야합니다. 이 코드와 내부 인터페이스는 사전 통보없이 변경되거나 삭제 될 수 있습니다.

좀 더 일반적인 주석 처리 프레임 워크에서 주석 처리 된 메소드의 본문에 액세스 할 수 있었으면 좋겠습니다.

답변

3

내 지식에 따라, 어노테이션 프레임 워크는 ExecutableElement의 본문에 액세스하는 것을 지원하지 않습니다. getEnclosedElements()을 호출하는 것이 유감이지만 javadoc에서는 다음과 같이 설명합니다.

대충 말하면서이 요소로 직접 둘러싸인 요소를 반환합니다. 클래스 또는 인터페이스는 직접 선언 한 필드, 메서드, 생성자 및 멤버 유형을 묶는 것으로 간주됩니다. 패키지는 최상위 클래스와 인터페이스를 패키지로 묶지 만 하위 패키지를 묶는 것으로 간주되지 않습니다. 다른 종류의 요소는 현재 어떤 요소도 둘러싸고있는 것으로 간주되지 않습니다. 그러나이 API 또는 프로그래밍 언어가 변경됨에 따라 변경 될 수 있습니다. 내 프로젝트에 대한

, 나는 다음과 같이 내가 메소드 본문에서 필요한 정보를 추출하기 위해 관리 : com.sun.source.util.Trees trees = Trees.instance(processingEnv); 내가 AbstractProcessorinit() 방법에 설정된 인스턴스 필드입니다

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

.

참조 된 jdk 도구 클래스에 대한 종속성에 대한 정보는 https://stackoverflow.com/a/29585979/6095334