标签:
在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明
Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:
– 可能的bug——空的try/catch/finally/switch块。
– 无用代码(Dead code):无用的本地变量,方法参数和私有方法。
– 空的if/while语句。
– 过度复杂的表达式——不必要的if语句,本来可以用while循环但是却用了for循环。
– 可优化的代码:浪费性能的String/StringBuffer的使用。
下载pmd , 配置CLASSPATH等内容
requirement
将压缩包解压在C盘
cmd 后然后输入以下内容:
-dir 指定目录, -f 指定生成的结果的格式 -R 使用何种规则进行检测
rulesets/java/*.xml 具体地址在pmd-bin-5.4.2\bin
规则如下:
PMD 包含 16 个规则集,涵盖了 Java 的各种常见问题,其中一些规则要比其他规则更有争议:
catch
块不该为空,无论何时重写 equals()
,都要重写 hashCode()
,等等。switch
语句应当有 default
块,应当避免深度嵌套的 if
块,不应当给参数重新赋值,不应该对 double 值进行相等比较。java.lang
的类中。suite()
方法是不是 static 和 public。String
构造函数,对 String
变量调用 toString()
方法。for
、 if
、 while
和 else
语句是否使用了括号。finalize()
方法不是那么普遍(我上次编写这个代码也经是好多年前的事了),所以它们的使用规则虽然很详细,但是人们对它们相对不是很熟悉。这类检查查找 finalize()
方法的各种问题,例如空的终结函数,调用其他方法的 finalize()
方法,对 finalize()
的显式调用,等等。clone()
方法的新规则。凡是重写 clone()
方法的类都必须实现 Cloneable
, clone()
方法应该调用 super.clone()
,而 clone()
方法应该声明抛出 CloneNotSupportedException
异常,即使实际上没有抛出异常,也要如此。java.lang.Exception
异常,不应当将异常用于流控制,不应该捕获 Throwable
,等等。sun
包导入等。java.util.logging.Logger
的不当使用,包括非终状态(nonfinal)、非静态的记录器,以及在一个类中有多个记录器。如果为了一次性将所需要的规则都进行检测,可以进行如下的操作
1、将现有的规则使用逗号进行隔离, rulesets/java/strings.xml,rulesets/java/xx.xml等
2、定义自己的规则集
<?xml version="1.0"?> <ruleset name="customruleset"> <description> Sample ruleset for developerWorks article </description> <rule ref="rulesets/design.xml"/> <rule ref="rulesets/naming.xml"/> <rule ref="rulesets/basic.xml"/> </ruleset>
更细致的规则集:
<?xml version="1.0"?> <ruleset name="specific rules"> <description> Sample ruleset for developerWorks article </description> <rule ref="rulesets/design.xml/AvoidReassigningParametersRule"/> <rule ref= "rulesets/design.xml/ConstructorCallsOverridableMethod"/> <rule ref="rulesets/design.xml/FinalFieldCouldBeStatic"/> <rule ref="rulesets/design.xml/DefaultLabelNotLastInSwitchStmt"/> <rule ref="rulesets/naming.xml/LongVariable"/> <rule ref="rulesets/naming.xml/ShortMethodName"/> <rule ref="rulesets/naming.xml/VariableNamingConventions"/> <rule ref="rulesets/naming.xml/MethodNamingConventions"/> <rule ref="rulesets/naming.xml/ClassNamingConventions"/> <rule ref="rulesets/basic.xml/EmptyCatchBlock"/> <rule ref="rulesets/basic.xml/EmptyFinallyBlock"/> </ruleset>
排除具体某个规则:
<?xml version="1.0"?> <ruleset name="dW rules"> <description> Sample ruleset for developerWorks article </description> <rule ref="rulesets/design.xml"> <exclude name="SwitchStmtsShouldHaveDefault"/> </rule> </ruleset>
可以使用-r参数来讲检测的结果导出到某个地方
在线文档:https://pmd.github.io/pmd-5.4.2/index.html
我们自己建立了一个自己的facebankrules.xml文件,只是简单的包含一部分我们认为重要的规则.
修改rulesets.properties,并将facebankrules.xml文件加入到压缩包中
facebank自己的规则如下;
<?xml version="1.0"?>
<ruleset name="facebankrules">
<description>
Sample ruleset for facebank developers
</description>
<rule ref="rulesets/java/unusedcode.xml"/>
<rule ref="rulesets/java/design.xml"/>
<rule ref="rulesets/java/imports.xml"/>
<rule ref="rulesets/java/strings.xml"/>
<rule ref="rulesets/java/braces.xml"/>
<rule ref="rulesets/java/codesize.xml"/>
<rule ref="rulesets/java/javabeans.xml"/>
<rule ref="rulesets/java/coupling.xml"/>
<rule ref="rulesets/java/strictexception.xml"/>
<rule ref="rulesets/java/logging-java.xml"/>
<rule ref="rulesets/java/sunsecure.xml"/>
</ruleset>
标签:
原文地址:http://www.cnblogs.com/huangxiaoying/p/5633732.html