快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
    clazzInfo.setNameOfSuperClass(e.getSuperclass().toString());      //Set implementing interface details      for (TypeMirror mirror : e.getInterfaces()) {          clazzInfo.addNameOfInterface(mirror.toString());      }      return super.visitClass(classTree, trees);   }

此代码段中使用的 JavaClassInfo 是用于存储有关 Java 代码的信息的自定义模 型。执行此代码之后,与类有关的信息,比如完全限定的类名称、超类名称、由 TestClass 实现的接口 等,被提取并存储在自定义模型中以供将来验证。

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

时间:2011-07-28 Deepa Sobhana

设置源码位置

到目前为止,我们一直在忙于获取有关 AST 各种节点的信息,并填充类、方法和字段信息的模型对象 。使用此信息,我们可以验证源码是否遵循好的编程实践,是否符合规范等。此信息对于 Checkstyle 或 FindBugs 等验证工具十分有用,但它们可能还需要有关违反此规则的源码令牌的位置详细信息,以便将 错误位置详细信息提供给用户。

SourcePositions 对象是 Compiler Tree API 的一部分,用于维护编译单位树中所有 AST 节点的位 置。此对象提供有关文件中 ClassTree、MethodTree、 FieldTree 等树的开始位置和结束位置的有用信 息。位置定义为从 CompilationUnit 开始位置开始的简单字符偏移,其中第一个字符位于偏移 0。下列 代码段显示如何获得传递的 Tree 树从编译单位开始位置开始的字符偏移位置。

public static LocationInfo getLocationInfo(Trees trees,                          TreePath path, Tree tree) {      LocationInfo locationInfo = new LocationInfo();      SourcePositions sourcePosition = trees.getSourcePositions();      long startPosition = sourcePosition.              getStartPosition(path.getCompilationUnit(), tree);      locationInfo.setStartOffset((int) startPosition);      return locationInfo; }

但是,如果我们需要获得提供类或方法本身名称的令牌的位置,则这些信息将不够。 要查找源码中的实际令牌位置,一个选项是搜索源码文件中 char 内容内的令牌。我们可以从与如下所示 编译单位相应的 JavaFileObject 中获取 char 内容。

//Get the compilation unit tree from the tree path CompilationUnitTree compileTree = treePath.getCompilationUnit(); //Get the java source file which is being processed JavaFileObject file = compileTree.getSourceFile(); // Extract the char content of the file into a string String javaFile = file.getCharContent(true).toString(); //Convert the java file content to a character buffer CharBuffer charBuffer = CharBuffer.wrap (javaFile.toCharArray());

下列代码段查找源码中类名称令牌的位置。java.util.regex.Pattern 和 java.util.regex.Matcher 类用于获取类名称令牌的实际位置。Java 源码的内容使用 java.nio.CharBuffer 转换为字符缓冲器。匹 配器从编译单位树中类树的开始位置开始,搜索字符缓冲器中与类名相匹配的令牌的第一次出现。

LocationInfo clazzNameLoc = (LocationInfo) clazzInfo.              getLocationInfo(); int startIndex = clazzNameLoc.getStartOffset(); int endIndex = -1; if (startIndex >= 0) {   String strToSearch = buffer.subSequence(startIndex,   buffer.length()).toString();   Pattern p = Pattern.compile(clazzName);   Matcher matcher = p.ma

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