快速业务通道

使用 Java 6 API分析源码 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
的一点是,如果将支持的注解类型指定为 @SupportedAnnotationTypes("*"),即使没有任何注解,仍然会调用注解处理器。这允许我们有效利用建 模 API 以及 Tree API 来执行通用的源码处理。使用这些 API,可以获得与修改符、字段、方法但等有 关的大量有用的信息。自定义注解处理器的代码段如下所示:

@SupportedSourceVersion(SourceVersion.RELEASE_6) @SupportedAnnotationTypes("*") public class CodeAnalyzerProcessor extends AbstractProcessor {    @Override    public boolean process(Set<? extends TypeElement> annotations,        RoundEnvironment roundEnvironment) {      for (Element e : roundEnvironment.getRootElements()) {          System.out.println("Element is "+ e.getSimpleName());          // Add code here to analyze each root element      }      return true;    } }

使用 Java 6 API分析源码(3)

时间:2011-07-28 Deepa Sobhana

是否调用注解处理器取决于源码中存在哪些注解,哪些处理器配置为可用,哪些注解 类型是可用的后处理器进程。注解处理可能发生在多个轮回中。例如,在第一个轮回中,将处理原始输入 Java 源文件;在第二个轮回中,将考虑处理由第一个轮回生成的文件,等等。自定义处理器应覆盖 AbstractProcessor 的 process()。此方法接受两个参数:

源文件中找到的一组 TypeElements/ 注解。

封装有关注解处理器当前处理轮回的信息的 RoundEnvironment。

如果处理器声明其支持的注解类型,则 process() 方法返回 true,而不会为这些注解调用其他处理 器。否则,process() 方法返回 false 值,并将调用下一个可用的处理器(如果存在的话)。

插入到注解处理器中

既然自定义注解处理器已经可供使用,现在让我们来看如何作为编译过程的一部分来调用此处理器。 此处理器可以通过 javac 命令行实用程序或以编程方式通过独立 Java 类来调用。Java SE 6 的 javac 实用程序提供一个称为 -processor 的选项,来接受要插入到的注解处理器的完全限定名。语法如下:

javac -processor demo.codeanalyzer.CodeAnalyzerProcessor TestClass.java

其中 CodeAnalyzerProcessor 是注解处理器类,TestClass 是要处理的 输入 Java 文件。此实用程序在类路径中搜索 CodeAnalyzerProcessor;因此,一定要将此类放在类路径 中。

以编程方式插入到处理器中的修改后的代码段如下。CompilationTask 的 setProcessors() 方法允许 将多个注解处理器插入到编译任务中。此方法需要在 call() 方法之前调用。还要注意,如果注解处理器 插入到编译任务中,则注解处理首先发生,然后才是编译任务。不用说,如果代码导致编译错误,则注解 处理将不会发生。

CompilationTask task = compiler.getTask(null, fileManager, null,                      null, null, compilationUnits1); // Create a list to hold annotation processors LinkedList<AbstractProcessor> processors = new LinkedList<AbstractProcessor> (); // Add an annotation processor to the list processors.add(new CodeAnalyzerProcessor()); // Set the annotation processor to the compiler task task.setProcessors(processors); // Perform the compilation task. task.call();

如果执行上述代码,它将导致注解处理器在用于打印名称“TestClass” 的 TestClass.java 的编译期间启动。

访问抽象语法树:Compiler Tree API

抽象语法树(Abstract Syntax Tree)是将 Java 表示为节点树的来源

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号