前提:

1.了解XPath:http://www.w3.org/TR/xpath

2.对PMD 的实现原理有一定的了解

简单介绍一下pmd的实现原理:

Pmd利用javacc和EBNF文法产生一个分析器,用来分析java源代码(文本)。又在JavaCC的基础上加入了语义的概念也就是JJTree,这样就把java source转换成了一个抽象语法树(AST),AST是一个结构化的对象层次结构。我们可以用访问者模式访问这个结构上的每个节点。从而找出哪个节点违反了哪些规则。

实现过程:

l首先传一个文件名或者Ruleset给pmd

lPmd把该文件流传给自己生成的javaCC分析器

l分析完毕后,pmd获得了分析生成的AST的一个引用

lPMD把AST处理成一个符号表,你可以在符号表里面查询一些有用的信息

l每个pmd规则都会遍历整个AST并检验是否发生了错误

l接着pmd产生一个报表,上面说明了有哪些地方违反了pmd规则

编写pmd规则有两种方法:

用java code,需要了解pmd的api,需要进行深入研究,也常常用于一些比较复杂的pmd规则

用xpath,对着产生的AST树,写就行了,上手比较快,写起来也比较简单

下面举一个用XPath实现的一个PMD规则:

在项目中,我们不希望Application的开发人员手动的调用Toplink UnitOfWork的commit,

commitAndResume, commitAndResumeOnFailure'方法,因为每次提交都会映像performa,我们的提交是放在自己编写的framework里面,在指定的位置提交。所以我们把规则的优先级设置为3. 在eclipse的pmd plugin中,优先级为3会产生一个警告。

1首先将D:"local_lib"pmd-bin-4.2"bin 加到系统环境变量的path中

2打开cmd 运行 designer 分析器

3左上角source code可以把你写好的java source copy过来主要就在这个java source code基础上不断修正你的pmd规则。

4xpath query:用来编写自定义的xpath expression(先不忙写xpath expression)

5点击go,就会在左下角的Abstract syntax Tree中产生AST,你可以选择AST上的某个节点,左下角的下面一个框中就会出现该节点的一些信息。是在符号表中查询得到的。

6.DFA是pmd4的新功能,用于编写更复杂的pmd规则,不光是某个source code级别了,pmd4使用了asm读取字节码,并作分析,处理类文件之间的依赖性。在实际使用中,特别是在特定应用中,这个功能是相当有用的。还可以用来简化一些现有的规则。

7根据生成的AST编写xpath expression。对于上文提到的source检查规则编写了一个xpath

Expression,在编写xpath expression的过程中需要反复的修改源代码并且反复的修改xpath expression这样才能满足所有的需要,反复的点击go。

最后写好的规则大致如下:

//PrimaryExpression[

(PrimaryPrefix/Name[ends-with(@Image, 'commit') or ends-with(@Image, 'commitAndResume') or ends-with(@Image, 'commitAndResumeOnFailure')] and substring-before(PrimaryPrefix/Name/@Image, '.') = //VariableDeclaratorId[../..//ClassOrInterfaceType[@Image =

'UnitOfWork']]/@Image) or (PrimarySuffix[ends-with(@Image, 'commit') or ends-with(@Image, 'commitAndResume') or ends-with(@Image, 'commitAndResumeOnFailure')] and (PrimarySuffix[ends-with(@Image, 'getActiveUnitOfWork')] or PrimarySuffix[ends-with(@Image, 'acquireUnitOfWork')]))

and

//ImportDeclaration/Name[

contains(@Image,'oracle.toplink.sessions.UnitOfWork') or contains(@Image, 'oracle.toplink.sessions')]

]

8.将写好的xpath expression转换成pmd rule。Designer可以自动生成点击菜单actions下面的create rule xml。

9.最后将生成的rule添加到ruleset中,并最好在大批量的代码中进行验证。

java pmd 规则_编写自定义的PMD规则相关推荐

  1. eclipse pmd使用_使用您自己的规则在Eclipse中自定义PMD

    eclipse pmd使用 PMD是非常好的Java代码扫描程序,可帮助您避免潜在的编程问题. 它可以轻松扩展以满足您的需求,并且本文将为您带来与JPA的@Enumerated注释用法相关的自定义PM ...

  2. assertj断言异常_编写自定义的AssertJ断言

    assertj断言异常 AssertJ是广泛使用的Hamcrest匹配器的替代匹配库. 实际上,对于我自己的项目,我已经更改为仅使用AssertJ-我只是发现流畅的界面和可扩展性非常吸引人. 您可以编 ...

  3. MyCat分片规则(全局表,ER分片表,多对多关联,主键分片VS非主键分片),MyCat常用的分片规则(15中分片规则),自定义MyCat分片规则,其它术语

    1 MyCat分片规则 数据切分中重要的几条原则,其中有几条数据冗余,表分组(Table Group). 1.1全局表 如果你的业务中有些数据类似于数据字典,比如配置文件的配置,常用业务的配置或数据量 ...

  4. 抽取样本java实验报告_一个自定义classloader的函数抽取壳样本

    原标题:一个自定义classloader的函数抽取壳样本 本文为看雪论坛文章 看雪论坛作者ID:lemn 本文为 看雪安卓高研2w班(7月班)优秀学员作品. 下面先让我们来看看学员的学习心得吧! 学员 ...

  5. java雪花纷飞_分析自定义view的实现过程-实现雪花飞舞效果(转载有改动)

    声明:本文源码出自实现雪花飞舞效果(有改动)主要通过这篇文来分析自定义view的实现过程. 没事时,比较喜欢上网看看一些新的东西,泡在网上的日子就是一个很不错的网站. 下面开始了,哈哈.^_^ 大家都 ...

  6. java 151建议_编写高质量代码改善java程序的151个建议——导航开篇

    前言 系列文章: 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,惨不忍睹是吧.确实,人和代码一样都在成长,都在变好当中.有时候只是实现功能的编程,长 ...

  7. java readline 实现_基于自定义BufferedReader中的read和readLine方法

    实例如下所示: package day0208; import java.io.FileReader; import java.io.IOException; /* * 自定义读取缓冲区,实现Buff ...

  8. java replaceall正则表达式_编写高性能Java代码的最佳实践

    作者:Eugen Paraschiv 翻译:雁惊寒https://dzone.com 摘要:本文首先介绍了负载测试.基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践 ...

  9. java word批注_编写Java批注

    java word批注 Java 批注的允许的属性类型刻意非常严格,但是允许的类型也可以使用一些简洁的复合批注类型. 考虑教程站点中的示例注释: package annotation; @interf ...

最新文章

  1. php改7z,PHP的7z扩展名? - php
  2. 快速排序(抽象理解,最快了解)
  3. ios10中禁止用户缩放页面
  4. sftp取代ftp的之后的权限设置
  5. Android Glide加载图片成圆形
  6. 在浏览器中进行深度学习:TensorFlow.js (十二)异常检测算法
  7. requirements.txt一键安装项目所需要的的python包
  8. eclipse中spring配置文件代码提示(全)
  9. 2018年ML/AI重大进展有哪些?LeCun推荐了这篇回答
  10. 利用交换机排查网络故障-检测数据流量法
  11. 踩过坑才懂:如何快速打造技术产品
  12. php创建文件目录,及删除目录和文件
  13. 贷前调查必须采集的十大客户信息
  14. 阿里云服务器ECS操作系统有哪些版本?
  15. java 多线程高级,java 多线程高级(传统多线程)
  16. LAMP兄弟连-招募PHP技术讲师
  17. 设定行车路线实验matlab,避障最优路径系统研究
  18. 案例:马斯洛需求层次理论——西游记的5人团队
  19. 韶关百万亩 国稻种芯·中国水稻节-邓泗洲:广东乐昌稻飘香
  20. 运用spss modeler运用支持向量机_四个小项目完全解读支持向量机

热门文章

  1. 阿里云双11的红包 不拼智商都不行
  2. java项目关联Q登陆,前后端分离项目 — SpringSocial 社交账号登录与注册
  3. Buu-crypto-classic0
  4. MACE源码解析【GPU内存排布技巧】
  5. Unity3d——打飞碟游戏(终极版)
  6. 澳门大学科技学院ECE(电机与电脑工程系)招收本硕博学生
  7. 排序算法-选择排序-堆排序
  8. 计算机进制编码怎么算,二进制编码-详细讲解
  9. strcmp函数的使用方法以及模拟
  10. Oracle 常用系统函数