如何找到 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() )
我正在编写一个注释处理器,我只对方法使用 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() )