如何找到 ExecutableElement 的 class 名称?

How to find class name of ExecutableElement?

我正在编写一个注释处理器,我只对方法使用 PostConstruct 注释。假设我有一个像这样的 class:

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) 的 class 名称,但 ExecutableElement 没有提供任何方法来做到这一点。是否有任何其他实用程序 classes 给我 class 名称?

声明方法的class是方法的封闭元素:

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

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

当涉及转换时,通常意味着应该使用其中一位访问者 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() )