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您必须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);
}
...
Run Code Online (Sandbox Code Playgroud)
您绝对不想使用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)
在所有情况下,这将正确获取软件包。
| 归档时间: |
|
| 查看次数: |
843 次 |
| 最近记录: |