PMD执行Java代码分析的原理

PMD是一种代码静态分析工具,当使用PMD规则分析Java源码时,PMD首先利用JavaCC和EBNF文法产生了一个语法分析器,用来分析普通文本形式的Java代码,产生符合特定语法结构的语法,同时又在JavaCC的基础上添加了语义的概念即JJTree,通过JJTree的一次转换,这样就将Java代码转换成了一个AST,AST是Java符号流之上的语义层,PMD把AST处理成一个符号表。然后编写PMD规则,一个PMD规则可以看成是一个Visitor,通过遍历AST找出多个对象之间的一种特定模式,即代码所存在的问题。

自定义PMD实现规则有如下2种方式:

(1). 自定义Java类并继承AbstractJavaRule抽象类,重写visit()方法,并在xml规则文件中引用该类。

name:自定义规则的名字;

language:要检查的语言

message:该规则被触发时,给出的消息提示;

class:规则使用类的全类名;

description:规则的描述信息;

priority:优先级别,从高到低依次是1-Blocker, 2-Critical, 3-Urgent, 4-important, 5-Warning;

example:在CDATA标签中书写一个该规则对应的实例。

示例:

自定义Java类对应xml规则

(2). 自定义XPATH表达式,编写xml规则,在规则的properties-property节点中定义XPATH表达式,该表达式是依赖于抽象语法树AST的。

name:自定义规则的名字;

language:要检查的语言

message:该规则被触发时,给出的消息提示;

class: xPath规则统一配置为net.sourceforge.pmd.lang.rule. XPathRule;

description:规则的描述信息;

priority:优先级别,从高到低依次是1-Blocker, 2-Critical, 3-Urgent, 4-important, 5-Warning;

example:在CDATA标签中书写一个该规则对应的实例。

properties:这个是xpath必须配置的,其子节点property,value值使用CDATA标签配置对应的xpath表达式的形式,可以有多个property。

示例:

自定义XPATH

阿里代码规约插件p3c-pmd源码实现解析

p3c-pmd的项目开源托管在github上,可以自行去https://github.com/alibaba/p3c下载,项目是maven管理,项目代码结构如下:

Paste_Image.png

p3c-pmd插件的实现是基于pmd的,更具体的来说是基于pmd-java的,因为pmd不仅支持java代码分析,还支持其他多种语言。具体实现自定义规则的方式当然也是上节所介绍的2种方式:自定义Java类和XPATH规则。

p3c-pmd插件封装了2个抽象类,分别介绍如下:

(1). 第一个是AbstractAliRule 继承了pmd的 AbstractJavaRule并重写visit(node,data)方法;AbstractPojoRule又继承了AbstractAliRule,用于检测Java类是否有Pojo。

第二个是AbstractXpathRule继承了pmd的抽象类XPathRule,用于处理XPATH规则。

最后给大家一个小小的福利,我把p3c-pmd项目的源码分包生成了对应的类图,大家可以自行下载,关注Java技术日志订阅号后,在消息框回复关键字:p3c或pmd可以获取类图下载地址。

本订阅号提供Java相关技术分享,从Java编程基础到Java高级技术,从JavaWeb技术基础Jsp、Servlet、JDBC到SSH、SSM开发框架,从REST风格接口设计到分布式项目实战。剖析主流开源技术框架,用亲身实践来谱写深度Java技术日志。“

作者:梁朋举

链接:https://www.jianshu.com/p/d1dda276c91c

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

pmd java规则_PMD执行Java代码分析的原理相关推荐

  1. pmd java规则_PMD - 用 Java 开发代码规则

    在 PMD 的使用过程中,可以用 Java 或 XPath 来开发代码规则. 本文讲述如何使用 Java 来开发. AST 对应的 Java 类库 PMD 使用抽象语法树(AST)来分析代码.它本身已 ...

  2. Java 线程池框架核心代码分析

    转载自 Java 线程池框架核心代码分析 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的.线程池应运而生,成为我们管理线程的利器.Java 通过Executo ...

  3. java调用、执行groovy代码

    java调用.执行groovy代码 1: package test; 2: 3: import javax.script.ScriptEngine; 4: import javax.script.Sc ...

  4. Java脚本引擎执行js代码以及动态编译

    Java脚本引擎执行js代码 一.概述 JAVA脚本引擎是从JDK6.0之后添加的新功能. 使得 Java 应用程序可以通过一套固定的接口与各种脚本引擎交互,从 而达到在 Java 平台上调用各种脚本 ...

  5. mybatis源码之执行insert代码分析

    系列文档: mybatis源码之创建SqlSessionFactory代码分析 mybatis源码之创建SqlSessionFactory代码分析 - mapper xml解析 mybatis源码之执 ...

  6. java文件 linux_Linux执行Java文件

    最近学习shell脚本,写个简单java类让linux去执行 java类没别的东西,就引了一个fastjson的jar,写了个main方法 序列化一个User对象 打印 package com.lws ...

  7. 为什么java可跨平台执行,java为什么可以跨平台执行

    java为什么可以跨平台执行以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! java为什么可以跨平台执行 因为java程 ...

  8. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  9. Java线程池框架核心代码分析

    前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的.线程池应运而生,成为我们管理线程的利器.Java 通过Executor接口,提供了一种标准的方法将任务的提交过 ...

最新文章

  1. 微服务限流Sentinel讲解(三)
  2. AMPAS/ASC Common File Format LUT
  3. 软件工程--团队作业4
  4. 我在这里,等你的故事【小废回家看看】
  5. java jframe 运行_java – 使用JProgressBar运行JFrame
  6. 八十一、Python | Leetcode 二叉树系列(下篇)
  7. CPU : Intel CPU命名规则
  8. ASP.NET Web API 处理架构
  9. 100篇论文串讲对话系统前世今生
  10. mysql5.1编译安装centos7_02: mysql 5.7 编译安装 (centos7)
  11. Java内存模型(Java Memory Model,简称JMM)
  12. 引起 Edge 浏览器远程代码漏洞的幕后黑手已出现!
  13. 笔记:Java 性能优化权威指南 第5章 Java 应用性能分析
  14. 点到平面的距离、向量与平面夹角
  15. 回程路由 的作用 为什么 什么时候需要回程路由
  16. 36页智慧安防小区管控系统解决方案
  17. java线性规划计算最优解算法
  18. 【日常学习】XML文件约束,Tomcat服务器和HTTP协议
  19. Python | 使用Python爬取Wallhaven网站壁纸并上传百度网盘
  20. 六度分离 (无向图最短路径问题)

热门文章

  1. svg android怎么填充颜色,android svg 使用方法及修改颜色
  2. 面试之抽象类和接口的区别
  3. 自我剖析-哪些缺点在影响我的发展
  4. 读庞小伟的《少数派》
  5. Articulate Studio课间制作工具
  6. C#实现的一些常见时间格式
  7. 记录《疯狂Java讲义精粹》划线内容及理解(第十章-输入输出流(IO))
  8. 利用Hyper-v部署Vista SP1 OS
  9. 深入浅出matplotlib(84): 两个信号互谱密度(CSD)的可视化
  10. vue中 使用element-ui 图标和阿里字体图标结合使用