一、引言
真能闹,怕喇喇蛄,还不种稻谷了?
喇喇蛄,是东北地区的一种虫害,常常在种稻子的时节,在池埂子上盗洞,造成水稻田里的水偷偷地流没有了,危害稻苗生长发育。
之后发觉原先写代码,也可以遇到“蝲蝲蛄”,无论你写的是啥作用、哪一种技术性、做何目地,蝲蝲蛄总是能给盗好多个洞出去。“你这早已有其余的某某了你怎么还造轮子”、“你这计划方案不好程序猿不必消耗时间”、“也没有看出去你这有啥优点和使用价值呀怎么给业务流程颠覆式创新”,这类话听上来“贼”有些道理,吹的钉铛的,但使他去做又能搞的稀的囊的。
因此,避开蝲蝲蛄,做你想要做的、搞你要搞的、学你想学的,知识是持续积累的累积、计划方案是累积后的造就。
二、要求目地
该怎么办,都是有规范的产品研发标准,但或是无法控制住到实际的每一个产品研发下,给写下哪些编码了。
有时规范仅仅文本文档,看和实施的这一环节中便会一定的改行无效性,你也许会加上方式;审查、扣费、罚业绩考核、反省这些,但那样有可能还仅仅提升全过程成本费,最后实际效果也不会太好。不大可能一个写代码还得配一个家庭保姆,因此如同 p3c、pmd-idea,那样的软件出来,协助程序猿把编码写好,整治掉一些不合标准的问题编码。
那麼,你好奇心这一事是怎么干的吗,如何你也就在 IDEA 写代码,它就能让你检验出去,对你说有什么问题,并提示你改动及其有一些还能够一键协助你改动呢?那假如想要再提升点你们企业个性化的需求的情况下,如何拓展呢?本章节目录大家就应用 IDEA 软件开发设计工作能力,把这个事办喽
三、实例开发设计
1. 工程项目构造
guide-idea-plugin-pmd├──.gradle└──src├──main│└──java│└──cn.bugstack.guide.idea.plugin│├──rule││├──FastJsonAutoType.java││├──HardcodedIp.java││└──ReplacePseudorandomGenerator.java│└──utils│└──InspectionBundle.java├──resources│├──inspectionDescriptions││├──FastJsonAutoType.html││├──HardcodedIp.html││└──ReplacePseudorandomGenerator.html│└──META-INF│└──plugin.xml├──build.gradle└──gradle.properties
在这里 IDEA 软件工程项目中,关键分成3块地区:
- rule:标准配备地区,以承继 IDEA 原生态 Inspection 查验类,拓展本身必须扫描仪的源代码精彩片段,开展警示、注解、修补。
- inspectionDescriptions:是相应的警示注解,撰写到 html 中,最后展现到 IDEA 下相应的问题编码精彩片段上。
- plugin.xml:中必须配备 localInspection 也就是配置你自定的编码检验完成类。
2. 伪随机数检验
目地:把编码中的 new Random 不安全伪随机数警示并带来修补,解决为 new SecureRandom
RandomRule
PsiElementFactoryfactory=JavaPsiFacade.getElementFactory(project);typeElement.replace(factory.createTypeElementFromText("SecureRandom",null));PsiNewExpressionsecureNewExp=(PsiNewExpression)factory.createExpressionFromText("newSecureRandom()",null);newExp.replace(secureNewExp);
- 根据承继 AbstractBaseJavaLocalInspectionTool Override buildVisitor 方式,拓展检验编码。如果你写了这一段方式后,IDEA 会把一行行的编码都根据这些方式传进去
- 在 visitNewExpression 方式中拓展本身的检验解决,碰到了哪一种编码精彩片段,要给予怎样的提示及其提示的等级,最终是保证一个 Fix 修补工作能力,这一修补工作能力就在更换这一段编码精彩片段,根据还能够实际操作引进新包的姿势 import xxx
3. FastJson检验
目地:com.alibaba:fastjson 在打开 AutoTypeSupport 时,存有反序列化风险性。假如程序流程中有 ParserConfig.getGlobalInstance().setAutoTypeSupport(true); 编码立即提示删掉解决。
publicPsiElementVisitorbuildVisitor(@NotNullProblemsHolderholder,booleanisOnTheFly){returnnewJavaElementVisitor(){@OverridepublicvoidvisitMethodCallExpression(PsiMethodCallExpressionexpression){if(hasFullQualifiedName(expression,"com.alibaba.fastjson.parser.ParserConfig","setAutoTypeSupport")){PsiExpression[]args=expression.getArgumentList().getExpressions();if(args.length==1&&args[0]instanceofPsiLiteralExpression&&Boolean.TRUE.equals(((PsiLiteralExpression)args[0]).getValue())){holder.registerProblem(expression,"FastJsonunserializationrisk",ProblemHighlightType.GENERIC_ERROR_OR_WARNING,newDeleteElementQuickFix(expression,"!Fix:removesetAutoTypeSupport"));}}}};}
全部对编码检测的操作基本上全是类似的,这一无非也是检测出代码库,并开展删掉的提醒解决 DeleteElementQuickFix
4. 提醒模板
<html><body><b>小傅哥-提醒:</b>不安全的伪随机数生成器<br><br><p>java.util.Random依靠一个可被预测分析的伪随机数生成器。</p><br><pstyle="font-size:10px;color:#629460;">最佳实践:</p><pstyle="font-size:10px;">应用java.security.SecureRandom</p></body></html>
提醒模板必须撰写 html 文件格式的內容,这一內容会被展现到错误码的详细信息里。后边大家做检测的可以查询
5. 检测配备
<extensionsdefaultExtensionNs="com.intellij"><localInspectionlanguage="JAVA"groupPath="Java"groupName="X-PMD"enabledByDefault="true"level="ERROR"bundle="InspectionBundle"key="replace.pseudorandom.generator.name"implementationClass="cn.bugstack.guide.idea.plugin.rule.RandomRule"/><localInspectionlanguage="JAVA"groupPath="Java"groupName="X-PMD"enabledByDefault="true"level="ERROR"bundle="InspectionBundle"key="fastjson.auto.type.name"implementationClass="cn.bugstack.guide.idea.plugin.rule.FastJsonRule"/><localInspectionlanguage="JAVA"groupPath="Java"groupName="X-PMD"enabledByDefault="true"level="WARNING"bundle="InspectionBundle"key="hardcoded.ip.name"implementationClass="cn.bugstack.guide.idea.plugin.rule.IPRule"/></extensions>
在 plugin.xml 中配备我们自己开发设计好的编码静态数据检测目标,那样你的检测类就起效了。
四、检测认证
运行软件
假如你下载编码后,沒有 Plugin 可以自已配备一下,在 Tasks 中配置 :runIde
不正确提醒
错误详细信息
如果你点一下 Fix,那麼下面就可以实现全自动更换编码并恢复了,便是把 Random random = new Random() 更换为 SecureRandom random = new SecureRandom();
别的2个还可以在获得编码后开展检测认证,一个是IP,此外一个是应用 ParserConfig.getGlobalInstance().setAutoTypeSupport(true); 的不正确提醒。
五、汇总
- 本章节目录大家学了怎么使用 IDEA 原生态 Inspection 查验体制,拓展我们自己必须加入的编码检测逻辑性,及其应用 LocalQuickFix 的完成类,做源代码的更换和引进回应包的操作。
- 此外针对编码检测,还有一个更为规范的专用工具叫 PMD 它是一款选用 BSD 协议书的编码查验专用工具,你能拓展完成给自己的规范和标准及其健全个性化的提醒和修补操作。
- 像 p3c 便是一款静态数据编码检测专用工具,用的人也非常多,但是它的插件开发并不是根据 Java 完成的,代码开发上也并沒有一些注释。因此特别提议阅读文章 pmd-idea,这款代码写的非常好,抽象充裕、构造清楚、內容详细:https://github.com/ybroeker/pmd-idea