天天看點

findbugs自定義檢查器

用檢查代碼中是否存在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自定義檢查器

繼續閱讀