快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
的只读视图,其中每个节点表 示一个 Java 编程语言构造或树,每个节点的子节点表示这些树有意义的组件。例如,Java 类表示为 ClassTree,方法声明表示为 MethodTree,变量声明表示为 VariableTree,注解表示为 AnnotationTree ,等等。

Compiler Tree API 提供 Java 源码的抽象语法树(Abstract Syntax Tree),还提供 TreeVisitor 、TreeScanner 等实用程序来在 AST 上执行操作。对源码内容的进一步分析可以使用 TreeVisitor 来完 成,它访问所有子树节点以提取有关字段、方法、注解和其他类元素的必需信息。树访问器以访问器设计 模式的风格来实现。当访问器传递给树的接受方法时,将调用此树最适用的 visitXYZ 方法。

Java Compiler Tree API 提供 TreeVisitor 的三种实现;即 SimpleTreeVisitor、 TreePathScanner 和 TreeScanner。演示应用程序使用 TreePathScanner 来提取有关 Java 源文件的信 息。 TreePathScanner 是访问所有子树节点并提供对维护父节点路径的支持的 TreeVisitor。需要调用 TreePathScanner 的 scan() 方法才能遍历树。要访问特定类型的节点,只需覆盖相应的 visitXYZ 方法 。在访问方法中,调用 super.visitXYZ 以访问后代节点。典型访问器类的代码段如下:

public class CodeAnalyzerTreeVisitor extends TreePathScanner<Object, Trees>  {    @Override    public Object visitClass(ClassTree classTree, Trees trees) {      ---- some code ----      return super.visitClass(classTree, trees);    }    @Override    public Object visitMethod(MethodTree methodTree, Trees trees) {      ---- some code ----      return super.visitMethod(methodTree, trees);    } }

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

时间:2011-07-28 Deepa Sobhana

可以看到访问方法接受两个参数:表示节点的树(ClassTree 表示类节点), MethodTree 表示方法节点,等),和 Trees 对象。Trees 类提供用于提取树中元素信息的实用程序方法 。必须注意,Trees 对象是 JSR 269 和 Compiler Tree API 之间的桥梁。在本例中,只有一个根元素, 即 TestClass 本身。

CodeAnalyzerTreeVisitor visitor = new CodeAnalyzerTreeVisitor(); @Override public void init(ProcessingEnvironment pe) {      super.init(pe);      trees = Trees.instance(pe); } for (Element e : roundEnvironment.getRootElements()) {      TreePath tp = trees.getPath(e);      // invoke the scanner      visitor.scan(tp, trees); }

下一节介绍使用 Tree API 来检索源码信息,并填充将来用于代码验证的通用模型。不管何时在使用 ClassTrees 作为参数的 AST 中访问类、接口或枚举类型,都会调用 visitClass() 方法。同样地,对于 使用 MethodTree 作为参数的所有方法,调用 visitMethod() 方法,对于使用 VariableTree 作为参数 的所有变量,调用 visitVariable(),等等。

@Override public Object visitClass(ClassTree classTree, Trees trees) {      //Storing the details of the visiting class into a model      JavaClassInfo clazzInfo = new JavaClassInfo();      // Get the current path of the node        TreePath path = getCurrentPath();      //Get the type element corresponding to the class      TypeElement e = (TypeElement) trees.getElement(path);      //Set qualified class name into model      clazzInfo.setName(e.getQualifiedName().toString());      //Set extending class info  

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号