2011-08-03 3 views
2

컴파일시에 주석 프로세서에 기본이되는 클래스에 메소드의 목록에 TypeVariable를 또는 VariableElement에서받을 수 setMessage 메소드에 전달 된 Object에 대한 getter 메소드 중 하나를 선택하면이 정보가 코드 생성에 사용됩니다.은 내가 주석 클래스가

나는 ElementScanner6를 확장하고 매개 변수를 보유하고있는 것으로 보이는 VariableElement를 관리하지만 여기서부터 어디로 가야할지 모르겠다.

그래서이 예제에서는 컴파일 타임에 TestMessage 클래스의 모든 메서드를 가져 오려고합니다.

어떤 아이디어

답변

9

주석 처리는 매우 복잡, 하나는, 다음 얻을 후,이 형태에 대응하는 요소를 얻을 매우 빠른 난 당신이 매개 변수 요소에 대응하는 유형을 얻을해야한다고 생각 .. 길을 잃을 수는 회원들을 필터링하십시오. 다음 코드를 사용하여 재생하려고하고 작동하는지 알려주세요 :

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"으로 시작하는 메소드를 매개 변수없이 사용한다고 가정했습니다.

질문에 대한 답변이 있습니까?

+0

남자. 이 대답은 대단합니다! 나는 elementsUtils와 ElementFilter에 대해 몰랐다. 이 API에 대한 훌륭한 자습서를 찾는 것은 매우 어렵습니다. 정말 고맙습니다!!! – Aurasphere