我有一个用AnnotationProcessor处理的类。
在此过程中,我有javax.lang.model.element.Element
的实例,我可以通过.getSimpleName()
获取带注释的类的名称。我所知道的是带注释的类的packageName( com.software.cool )。
知道如何通过API接收它吗?
答案 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