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

时间:2017-10-12 14:47:29

标签: java annotations annotation-processing

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

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

4 个答案:

答案 0 :(得分:4)

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

同样,对于默认(未命名)包中的类,在点之前没有任何内容......

使用Entry,您的解析代码将变得复杂且不可靠。一般来说,当你必须使用Element的字符串表示时,你做错了。

这是获取getQualifiedName包的正确模式:

element

这将在所有案例中正确获取包。

答案 1 :(得分:2)

最好的方法是去ProcessingEnvironment.getElementUtils(),它有一个非常方便的方法叫做getPackageOf。 为了获得ProcessingEnviroment,您必须在init实现中重写AbstractProcessor方法。

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);
    }
    ...

答案 2 :(得分:-1)

您可以在类对象上使用getPackage()方法,即

Element target;
Package pkg = target.getClass().getPackage();
String pkgName = pkg.getName();

进一步阅读: getPackage Javadocs

答案 3 :(得分:-1)

element.getQualifierName()实际上有我想要的东西!

thx to @Yogi