快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
tcher(strToSearch);   matcher.find();   startIndex = matcher.start() + startIndex;   endIndex = startIndex + clazzName.length();   } clazzNameLoc.setStartOffset(startIndex); clazzNameLoc.setEndOffset(endIndex); clazzNameLoc.setLineNumber(compileTree.getLineMap().         getLineNumber(startIndex));

Complier Tree API 的 LineMap 类提 供 CompilationUnitTree 中字符位置和行号的映射。我们可以通过将开始偏移位置传递给 CompilationUnitTree 的 getLineMap() 方法来获取所关注令牌的行号。

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

时间:2011-07-28 Deepa Sobhana

按照规则验证源码

既然已经从 AST 中成功检索了所需的信息,下一个任务就是验证所考虑的源码是否满足预定义的编码 标准。编码规则在 XML 文件中配置,并由名为 RuleEngine 的自定义类管理。此类从 XML 文件中提取规 则,并一个一个地将其启动。如果此类不满足某个规则,则此规则将返回 ErrorDescription 对象的列表 。 ErrorDescription 对象封装错误消息和错误在源码中的位置。

ClassFile clazzInfo = ClassModelMap.getInstance().          getClassInfo(className); for (JavaCodeRule rule : getRules()) {      // apply rules one by one      Collection<ErrorDescription> problems = rule.execute(clazzInfo);      if (problems != null) {          problemsFound.addAll(problems);      } }

每个规则实现为 Java 类;要验证的类的模型信息传递给此类。规则类封装逻辑以使 用此模型信息验证规则逻辑。示例规则 (OverrideEqualsHashCode) 的实现如下所示。此规则规定覆盖 equal() 方法的类还应该覆盖 hashcode() 方法。在此,我们遍历类的方法并检查它是否遵循 equals() 和 hashcode() 合同。在 TestClass 中,hashcode() 方法不存在,而 equals() 方法存在,从而导致规 则返回 ErrorDescription 模型,其中包含适当的错误消息和错误的位置详细信息。

public class OverrideEqualsHashCode extends JavaClassRule {    @Override    protected Collection<ErrorDescription> apply(ClassFile clazzInfo) {      boolean hasEquals = false;      boolean hasHashCode = false;      Location errorLoc = null;      for (Method method : clazzInfo.getMethods()) {        String methodName = method.getName();        ArrayList paramList = (ArrayList) method.getParameters();        if ("equals".equals(methodName) && paramList.size() == 1) {          if ("java.lang.Object".equals(paramList.get(0))) {            hasEquals = true;            errorLoc = method.getLocationInfo();          }        } else if ("hashCode".equals(methodName) &&          method.getParameters().size() == 0) {          hasHashCode = true;        }      }      if (hasEquals) {        if (hasHashCode) {          return null;        } else {          StringBuffer errrMsg = new StringBuffer();          errrMsg.append(CodeAnalyzerUtil.                  getSimpleNameFromQualifiedName(clazzInfo.getName()));          errrMsg.append(" : The class that overrides              

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