2016-03-08 4 views
1

Я пишу обработчик аннотации, который я использую только для методов. Предположим, что у меня есть класс, как это:Как найти имя класса ExecutableElement?

public MyClass{ 

    @PostConstruct 
    public void onCreate(){ 

    } 
} 

Так внутри моего процессора аннотаций я могу получить onCreate метод:

for (Element element : roundEnv.getElementsAnnotatedWith(PostConstruct.class)) { 

      if (element.getKind() != ElementKind.METHOD) { 
       return false; 
      } 
      ExecutableElement method = (ExecutableElement) element; 

     } 

А также я должен знать о имя класса onCreate метода (MyClass) но ExecutableElement не предоставил никаких методов для этого. Есть ли какие-либо другие классы полезности, чтобы дать мне имя класса?

ответ

3

Класс объявлении метода является метод в ограждающих элементов:

TypeElement declaringClass = 
    (TypeElement) method.getEnclosingElement(); 

String className = 
//   also getSimpleName() 
    declaringClass.getQualifiedName().toString(); 
1

При отливке вовлекается, это обычно означает, что один из посетителей API должен быть использован вместо. Хотя они более подробные, они являются единственным безопасным вариантом.

В следующем примере запускается ошибка компиляции, если что-то еще, чем элемент типа, посещается, вы можете, естественно, адаптировать эту часть к вашим потребностям.

public class TypeElementVisitor extends SimpleElementVisitor8<TypeElement, Void> 
{ 
    private final Messager messager; 

    public TypeElementVisitor(Messager messager) 
    { 
     this.messager = messager; 
    } 

    @Override 
    public TypeElement visitType(TypeElement e, Void ignored) 
    { 
     return e; 
    } 

    @Override 
    public TypeElement visitUnknown(Element e, Void ignored) 
    { 
     messager.printMessage(Diagnostic.Kind.ERROR, "Expected an enclosing class, got: " + e.toString(), e); 
     return null; 
    } 
} 

Вы можете использовать его как это:

ExecutableElement execElement = [...]; 
ElementVisitor<TypeElement, Void> enclosingTypeVisitor = new TypeElementVisitor(processingEnvironment.getMessager()); 
TypeElement enclosingType = enclosingTypeVisitor.visit(execElement.getEnclosingElement()) 
Смежные вопросы