微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在尝试编写一个自定义的Anntoation处理器.
注释处理器将在编译时处理每个类文件以检查注释,
但是我怎么能得到它正在处理的课程呢?
我只能在以下代码获取类名.
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
             }
        }
    }
}

原文地址:https://www.jb51.cc/java/123661.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐