在AnnotationProcessor中获取带注释的类的包名称

xet*_*a11 4 java annotations annotation-processing

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

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

Ser*_*rge 10

最好的方法是 to ProcessingEnvironment.getElementUtils()which 有一个非常方便的方法,称为getPackageOf. 为了让ProcessingEnviroment您必须initAbstractProcessor实现中覆盖方法。

public class DynamicServiceProcessor extends AbstractProcessor {

private ProcessingEnvironment processingEnvironment;
private Elements elementUtils;

@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
    super.init(processingEnvironment);
    this.processingEnvironment = processingEnvironment;
    this.elementUtils = processingEnvironment.getElementUtils();
}

@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
    ...
    for (Element element : roundEnvironment.getElementsAnnotatedWith(DynamicService.class)) {
        PackageElement packageElement = processingEnvironment.getElementUtils().getPackageOf(element);
    }
    ...
Run Code Online (Sandbox Code Playgroud)


use*_*723 5

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

同样,对于默认(未命名)程序包中的类,在点之前不会有任何内容……

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

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

Element enclosing = element;
while (enclosing.getKind() != ElementKind.PACKAGE) {
    enclosing = enclosing.getEnclosingElement();
}
PackageElement packageElement = (PackageElement) enclosing;
Run Code Online (Sandbox Code Playgroud)

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