用檢查代碼中是否存在System.out為例。 package edu.umd.cs.findbugs.detect;
import org.apache.bcel.classfile.Code;
import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.BugReporter;
import edu.umd.cs.findbugs.bcel.OpcodeStackDetector;
/**
* @author 判斷System.out和System.error這種情況
*/
public class ForbiddenSystemClass extends OpcodeStackDetector {
BugReporter bugReporter;
public ForbiddenSystemClass(BugReporter bugReporter) {
this.bugReporter = bugReporter;
}
/**
* visit方法,在每次進入位元組碼方法的時候調用 在每次進入新方法的時候清空标志位
*/
@Override
public void visit(Code obj) {
super.visit(obj);
}
/**
* 每掃描一條位元組碼就會進入sawOpcode方法
*
* @param seen
* 位元組碼的枚舉值
*/
@Override
public void sawOpcode(int seen) {
// getstatic #57; //Field java/lang/System.out:Ljava/io/PrintStream;
if (seen == GETSTATIC) {
if (getClassConstantOperand().equals("java/lang/System")
&& (getNameConstantOperand().equals("out") || getNameConstantOperand()
.equals("error"))) {
BugInstance bug = new BugInstance(this, "CJ_SYSTEMCLASS",
NORMAL_PRIORITY).addClassAndMethod(this).addSourceLine(
this, getPC());
bugReporter.reportBug(bug);
}
}
}
}
配置檔案 :findbugs.xml <FindbugsPlugin>
<Detector class="edu.umd.cs.findbugs.detect.ForbiddenSystemClass" speed="fast" reports="CJ_SYSTEMCLASS" hidden="false" />
<BugPattern abbrev="CJ_SYSTEMCLASS" type="CJ_SYSTEMCLASS" category="PERFORMANCE" />
</FindbugsPlugin>
配置檔案 :message.xml <?xml version="1.0" encoding="UTF-8"?>
<MessageCollection>
<Plugin>
<ShortDescription>Default FindBugs plugin</ShortDescription>
<Details>
<![CDATA[
<p>
This plugin contains all of the standard FindBugs detectors.
</p>
]]>
</Details>
</Plugin>
<Detector class="edu.umd.cs.findbugs.detect.ForbiddenSystemClass">
<Details>
<![CDATA[
<p>代碼不能出現System.out
<p>請使用log日志形式列印
]]>
</Details>
</Detector>
<BugPattern type="CJ_SYSTEMCLASS">
<ShortDescription>代碼不能出現System.out</ShortDescription>
<LongDescription>{1}代碼不能出現System.out,請使用log形式輸出</LongDescription>
<Details>
<![CDATA[
<p>不能使用System.out和System.err,請使用log</p>
]]>
</Details>
</BugPattern>
<BugCode abbrev="CJ_SYSTEMCLASS">影響性能的輸出System.out</BugCode>
</MessageCollection>
findbugs自定義檢查器