Как найти имя класса ExecutableElement?

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

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 не предоставил никаких методов для этого. Существуют ли какие-либо другие служебные классы, чтобы дать мне имя класса?


person Saeed Masoumi    schedule 08.03.2016    source источник


Ответы (2)


Класс, объявляющий метод, является элементом, охватывающим метод:

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

String className =
//            also getSimpleName()
    declaringClass.getQualifiedName().toString();
person Radiodef    schedule 08.03.2016

Когда задействовано кастинг, это обычно означает, что вместо этого следует использовать один из 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() )
person fbiville    schedule 07.03.2017