我有一个用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;
在所有情况下,这将正确获取软件包。