gpt4 book ai didi

java - Annotation Processor - 如何获取它正在处理的类

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:34:36 25 4
gpt4 key购买 nike

我正在尝试编写自定义 Anntoation 处理器。注解处理器会在编译时处理每个class文件来检查注解,但是我怎样才能得到它当前正在处理的类呢?我只能在以下代码中获取类名。

public class AnnotationProcessor extends AbstractProcessor {
......
@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {

Set<? extends Element> rootE=roundEnv.getRootElements();
for(Element e: rootE) {
if(e.getKind()==ElementKind.CLASS) {
String className= e.getSimpleName().toString();
processingEnv.getMessager().printMessage( javax.tools.Diagnostic.Kind.WARNING,className, e);
}
}
}

最佳答案

您无法访问注释处理器正在处理的类,因为该类尚未编译。相反,Java 提供了类似的 Elements api,用于对输入源进行反射式检查。

Element(您使用 roundEnv.getRootElements() 找到的)包含有关正在编译的类的更多信息,而不仅仅是其名称。使用 ElementVisitors 可以找到大量有用的信息:

http://docs.oracle.com/javase/6/docs/api/javax/lang/model/element/ElementVisitor.html http://docs.oracle.com/javase/6/docs/api/javax/lang/model/util/ElementKindVisitor6.html

包括类的构造函数、方法、字段等

使用方法如下:

public class AnnotationProcessor extends AbstractProcessor {
......
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {

Set<? extends Element> rootE=roundEnv.getRootElements();
for(Element e: rootE) {
for(Element subElement : e.getEnclosedElements()){
subElement.accept(new ExampleVisitor(), null); // implement ExampleVisitor
}
}
}
}

关于java - Annotation Processor - 如何获取它正在处理的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18034626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com