作者:小傅博客:https://bugstack.cn原文:https://mp.weixin.qq.com/s/RwzprbY2AhdgslY8tbVL-A1.前言你是否对你使用的所有技术感到好奇??虽然我们都叫码农,都写代码,但是因为场景的需求不同,所以各种码农做的事情也不一样。有的人统一标准化,有的开发组件,有的写业务,有的做验证,但是工作内容越像CRUD一样简单,越多的码农使用别人提供的好东西。一个会安装插件,一个会引入Jar包,一个会调整其他的个别接口,我的工作就像一个组装工,打补丁,写产品需求。坏了,做这个可能要几年时间,技术上不会有突破。因为你对那些技术并不好奇,也不想知道它们是如何实现的。就像阿里的P3C插件一样,我写的这个坑是怎么查代码分析的?2、什么是P3C插件?P3C是阿里巴巴开源代码库的插件项目名称。是基于阿里巴巴Java开发手册开发的代码质量监控IDEA/Eclipse插件。源码:https://github.com/alibaba/p3c安装插件后,可以根据编程协议对代码中出现的代码进行静态分析:命名风格、常量定义、集合处理、并发处理、OOP、控制语句、注释、异常等潜在风险,同时给出一些优化操作和例子。在坚持开发手册的标准,按照插件进行检查的情况下,编码标准和风格还是可以很好统一的,也可以排除一些潜在的风险。如果您是新手编程用户或希望编写标准代码,强烈建议您使用此插件来辅助您进行代码开发。当然,如果贵公司也有相应的标准手册和插件,您也可以关注并遵守协议。3.P3C插件源码刚开始用这类代码查插件的时候,很好奇它是怎么找到我的狮山代码的,它采用了什么样的技术原理。如果我可以分析它,可以吗?在其他地方使用这些技术手段。在分析这样一个代码检查插件之前,先想着检查一下IDEA插件的源码,看看它是什么逻辑,然后再分析它是如何使用的。其实这和其他一些框架源码学习类似。拿到官网文档和GitHub对应的源码,按照步骤构建、部署、测试、调试、分析,然后找到核心原理。P3C以IDEA插件开发为例,主要涉及插件部分和协议部分。因为它结合了协议检查的能力和插件技术,所以会涉及到一些IDEA开发的技术。另外,P3C插件涉及到所有的技术语言,不仅仅是Java,还包括kotlin的一部分,kotlin是一种运行在Java虚拟机上的静态类型编程语言。插件源码:https://github.com/alibaba/p3c/blob/master/idea-plugin规范源码:https://github.com/alibaba/p3c/tree/master/p3c-pmd1。插件配置p3c.xmlView源码最重要的是找到入口。这个入口一般是你在使用插件、程序、接口等的时候最直接可以进入的部分,那么我们在使用P3C插件的时候,最明显的就是扫描编码协议在里面找到这个关键字查看源代码,看看它涉及到哪些类并进行配置。action是IDEA插件中配置表单事件入口的地方,以及配置这个操作到哪个按钮和对应的快捷键。2.编码规范扫描(AliInspectionAction)classAliInspectionAction:AnAction(){overridefunactionPerformed(e:AnActionEvent){valproject=e.project?:returnvalanalysisUIOptions=ServiceManager.getService(project,AnalysisUIOptions::class.java)!!analysisUIOptions.GROUP_BY_SEVERITY=truevalmanagerEx=InspectionManager.getInstance(project)asInspectionManagerExvaltoolWrappers=Inspections.aliInspections(project){it.tool是AliBaseInspection}valpsiElement=e.getDataPsiELKeys.PsiELKeys。e.getData(CommonDataKeys.PSI_FILE)valvirtualFile=e.getData(CommonDataKeys.VIRTUAL_FILE)...createContext(toolWrappers,managerEx,element,projectDir,analysisScope).doInspections(analysisScope)}这是基于kotlin语言开发的插件代码逻辑,它通过actionPerformed该方法获取项目信息、类信息等,然后可以执行代码查看doInspections3。当我们向下看并阅读协议p3c-pmd时,我们会看到有关pmd的一些信息。PMD是BSD协议发布的Java程序静态代码检查工具,在使用PMD规则分析Java源代码时,PMD首先使用JavaCC和EBNF文法生成语法分析器,用于分析普通文本形式的Java代码并生成符合特定语法结构的文法。同时在JavaCC的基础上增加了语义的概念,即JJTree。通过JJTree的转换,将Java代码转换为AST。AST是Java符号流之上的语义层。PMD将AST处理成符号。表面。然后写PMD规则,一个PMD规则可以看做一个Visitor,通过遍历AST找出多个对象之间的特定模式,也就是代码中的问题所在。该软件功能强大,扫描效率高,是Java程序员调试的好帮手。那么p3c-pmd是什么?ViolationUtils.addViolationWithPrecisePosition(this,node,data,I18nResources.getMessage("java.naming.ClassNamingShouldBeCamelRule.violation.msg",node.getImage()));p3c-pmd插件是基于PMD实现的,更具体地说是基于pmd-java,因为PMD不仅支持Java代码分析,还支持很多其他语言。自定义规则的具体方式是通过自定义Java类和XPATH规则来实现的。4、协议监控情况合理。说一千字一万,你得把代码拿出来跑一跑才知道PMD长啥样。1、测试项目guide-pmd└──src├──main│├──java││└──cn.itedus.guide.pmd.rule│├──命名││├──ClassNamingShouldBeCamelRule.java│...─资源│├──规则│└──ali-naming.xml│├──messages.xml│└──namelist.properties└──测试└──java└──cn.itedus.demo.test├──ApiTest.java└──TERrDto.java源码:https://github.com/fuzhengwei/guide-pmd这是一个类似p3c-pmd的测试工程,通过自扩重写来处理代码监控协议自己处理代码审计标准。naming下面的类用来处理一些和名字相关的规则,比如类名,属性名,方法名等,resources下面的ali-naming.xml是协议的配置文件2.Humpback命名约定publicclassClassNamingShouldBeCamelRuleextendsAbstractJavaRule{privatestaticfinalPatternPATTERN=Pattern.compile("^I?([A-Z][a-z0-9]+)+(([A-Z])|(DO|DTO|VO|DAO|BO|DAOImpl|YunOS|AO|PO))?$");@OverridepublicObjectvisit(ASTClassOrInterfaceDeclarationnode,Objectdata){if(PATTERN.matcher(node.getImage()).matches()){返回超级。访问(节点,数据);}ViolationUtils.addViolationWithPrecisePosition(this,node,data,I18nResources.getMessage("java.naming.ClassNamingShouldBeCamelRule.violation.msg",node.getImage()));返回超级访问(节点,数据);}}继承PMD提供的AbstractJavaRule是一个抽象类,重写了visit方法,使用常规方法进行验证。visit方法有很多入参,用于处理类、接口、方法、代码等各种内容的监听和处理,只要重写需要的方法,就可以自己处理.ClassNamingShouldBeCamelRule、ConstantFieldShouldBeUpperCaseRule、LowerCamelCaseVariableNamingRule功能类似,这里就不一一展示了,大家可以直接参考源码。3.ali-naming.xml配置3用于配置ali-naming.xml中的协议处理类、优先级、消息提示文本。同时,你也可以配置代码示例,使用标签,将标准代码写在里面。4.测试验证规范问题类示例publicclassTERrDto{publicstaticfinalLongmax=50000L;publicvoidQueryUserInfo(){booleanbaz=true;while(baz)baz=false;}}单元测试@Testpublicvoidtest_naming(){String[]str={"-d","E:\\itstack\\git\\github.com\\guide-pmd\\src\\test\\java\\cn\\itedus\\demo\\test\\TERrDto.java","-f","text","-R","E:\\itstack\\git\\github.com\\guide-pmd\\src\\main\\resources\\rule\\ali-naming.xml"//"category/java/codestyle.xml"};PMD.main(str);}规范的测试验证可以直接使用PMD.main方法,在方法Array输入参数中提供一个字符串,其中代码监控地址和协议配置需要是绝对路径。测试结果TERrDto.java:3:[TERrDto]不符合大驼峰命名风格TERrDto.java:5:常量[max]命名应全部大写,下划线分隔TERrDto.java:7:方法名[QueryUserInfo]不符合lowerCamelCase命名风格Processfinishedwithexitcode4从测试结果可以看出,我们写的三个代码规范都检测到了代码的命名风格,常量大小写,方法名不符合骆驼案例。同时也可以测试category/java/codestyle.xml,这是PMD自己提供的一个很好的协议监控。5.扩展理解Sonar其实有PMD静态代码检查协议,它可以做很多事情,不仅可以检查正在编写的代码,还可以对不同阶段的代码进行分析和警告,比如:为测试做准备stage,已经在线完成,可以进行相应的监控。而Sonar就是这样一个工具。是一个可以展示静态扫码结果的web系统。结果可以定制。支持多种语言的原则是它的可扩展性。https://www.sonarqube.org/不遵循代码标准:sonar可以通过PMD、CheckStyle、Findbugs等代码规则检测工具规范代码编写。潜在缺陷:Sonar可以通过PMD、CheckStyle、Findbugs等代码规则检测工具发现潜在缺陷。糟糕的复杂度分布:文件、类、方法等太复杂将难以更改,这使得开发人员难以理解它们,并且如果没有自动化单元测试,程序中的任何组件都可能发生更改Leads需要进行全面的回归测试。重复:很明显,程序中包含大量复制和粘贴的代码质量低下,sonar可以显示源代码中严重的重复。注释不足或过多:没有注释,代码的可读性会很差,尤其是在人员变动不可避免的情况下,程序的可读性会大大降低,过多的注释会使开发人员花费过多的精力花费很多花时间看注释也违背了初衷。缺少单元测试:Sonar可以轻松统计和显示单元测试覆盖率。不好的设计:通过sonar可以查出环路,展示包与包、类与类之间的依赖关系,可以通过sonar检测自定义架构规则,可以管理第三方jar包,可以使用LCOM4检测单体任务规则应用,检测耦合。提高代码质量:了解你在编码过程中所犯的错误,让你的代码更具可读性和可维护性。6.总结PMD是一个采用BSD协议的代码检查工具。您可以扩展和实现自己的标准和规范,以及改进个性化提醒和维修操作。另外,基于IDEA插件实现代码检查或有审计需求的处理,还可以在IDEA插件的基础上做更多的扩展,如提醒修复、提供修复操作、检查自身业务逻辑等。比如momo开源库下的一个IDEA静态代码安全审计和漏洞一键修复插件https://github.com/momosecurity/momo-code-sec-inspector-java添加这里,kotlin语言可以转换成IDEAJava语言,这样大家在看代码的时候,如果看不懂,可以转换一下再看。另外IDEA插件开发需要基于Gradle或者自己提供的模板来创建。有兴趣的也可以看看我写的IDEA插件开发文章。7、基于IDEA插件开发和字节码插装技术实现研发交付质量自动分析技术研究的系列推荐,如何开发IDEA插件“脚手架、低代码可视化编排、界面生成测试”?《SpringBoot 中间件设计和开发》笔记整理:技术架构涵盖内容及演进过程总结加点实践学习,开发分布式IM(即时通讯)系统!%E7%B3%BB%E7%BB%9F.html)