阿里巴巴Java代码规约插件p3c-pmd

2024-06-17 13:08

本文主要是介绍阿里巴巴Java代码规约插件p3c-pmd,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

clipse版插件支持4.2(Juno,JDK1.8+)及以上版本,通过 Help
-- Install New Software 然后输入https://p3c.alibaba.com/plugin/eclipse/update 即可看到安装列表。可以通过 Help-- Check for Udates 进行插件新版检测。


Eclipse插件安装
勾选Ali-CodeAnalysis,Next,安装完成后重启即可。


代码检查 Inspections

File-Settings-Editor- Inspections,打开后右侧找到Ali-Check,可以看到很多代码检查规则,可以修改规则对应提示的颜色。这里一共有55条规则。


Inspections
以编程规约之命名风格为例:

变量test_Double命名不符合驼峰形式,高亮显示,Ctrl+F1给出修改提示

驼峰形式变量名称
常量Test_CONSTANT命名不符合规范,高亮显示,Ctrl+F1给出修改提示

常量规范
代码分析Code Analyze

在当前类中右键或者在左侧Project视图中类名称上右键,选择Alibaba Coding Guidelines Analyze, 可以对某一个类进行代码分析;也可以直接在Project视图中,项目的包上面单击右键,选择Alibaba Coding Guidelines Analyze,可以批量分析包中所有类


Alibaba Coding Guidelines Analyze
分析结果在IDEA底部逐条给出,我们还是对上面的类进行分析,结果如下:


分析结果

单击红色矩形框可以跳转到代码所在行。

P3C-PMD插件实现规则说明

P3C-PMD插件基于PMD实现了《阿里巴巴Java开发手册》中涉及的48条规则。
编程规约 (六)并发处理,实现了1、2、3、4、5、10、11、12等8条规则;
编程规约(五)集合处理,实现了4、5、6、7、9、11等6条规则;
编程规约(一)命名风格,实现了1、2、3、4、5、6、7、8、9、13等10条规则;
编程规约(二)常量定义,实现了1、2等2条规则;
编程规约(四)OOP规约,实现了5、6、7、8、9、12、17等7条规则;
编程规约(七)控制语句,实现了1、2、4等3条规则;
编程规约(八)注释规约,实现了1、2、3、4、5等5条规则;
编程规约(九)其他,实现了1、3、4、5等4条规则;
异常日志 (一)异常处理,实现了5、7、10等3条规则;

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管理,项目代码结构如下:


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规则。

这篇关于阿里巴巴Java代码规约插件p3c-pmd的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069529

相关文章

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN