我有一个用AnnotationProcessor处理的类。
在此过程中,我有一个javax.lang.model.element.Element实例,在这里我可以通过.getSimpleName()获取带注释的类的名称。我知道需要的是带注释的类的packageName(com.software.cool)。

知道如何通过API来接收它吗?

最佳答案

您绝对不想使用getQualifiedName:在某些情况下,它将产生令人惊讶的结果。例如,不可能区分包名称的最后一部分和内部类的父类:在“java.util.Map.Entry”中,“Map”是包名称的一部分还是Entry的包含类的名称?如果不是“java.util.Map.Entry”而是“a.b.c.d”(Proguard处理的代码的典型情况)怎么办?

同样,对于默认(未命名)包中的类,在点之前也不会有任何东西……

使用getQualifiedName,您的解析代码将是复杂且不可靠的。一般来说,当您必须使用Element的字符串表示形式时,您所做的事情是错误的。

这是获取element软件包的正确模式:

Element enclosing = element;
while (enclosing.getKind() != ElementKind.PACKAGE) {
    enclosing = enclosing.getEnclosingElement();
}
PackageElement packageElement = (PackageElement) enclosing;

在所有情况下,这将正确获取软件包。

10-06 13:15