这类文章极少,字节码操作需要对becl库及jvm字节码操作有一定常识。参考:

http://blog.csdn.net/lywybo/archive/2010/03/01/5335748.aspx

ibm介绍的原理实用,但配置过时;支付宝朋友写的message.xml/findbugs.xml不够详细且有笔误。

1.1准备

修改build.xml ,去除所有的validate依赖。执行ant编译。

eclipse引入findbugs工程。

1.2实现类

直接在findbugs目录中增加类

packageedu.umd.cs.findbugs.detect;

importorg.apache.bcel.classfile.Code;

importedu.umd.cs.findbugs.BugInstance;

importedu.umd.cs.findbugs.BugReporter;

importedu.umd.cs.findbugs.bcel.OpcodeStackDetector;

/**

*@authorbo

*这个规则类用于判断System.out和System.error这种情况

*/

publicclassForbiddenSystemClassextendsOpcodeStackDetector{

BugReporterbugReporter;

publicForbiddenSystemClass(BugReporter bugReporter) {

this.bugReporter= bugReporter;

}

/**

* visit方法,在每次进入字节码方法的时候调用

*在每次进入新方法的时候清空标志位

*/

@Override

publicvoidvisit(Code obj) {

super.visit(obj);

}

/**

*每扫描一条字节码就会进入sawOpcode方法

*

*@paramseen字节码的枚举值

*/

@Override

publicvoidsawOpcode(intseen) {

if(seen ==GETSTATIC) {

if(getClassConstantOperand().equals("java/lang/System")

&& (getNameConstantOperand().equals("out") || getNameConstantOperand().equals("error"))) {

BugInstance bug =newBugInstance(this,"ALP_SYSTEMCLASS",NORMAL_PRIORITY).addClassAndMethod(this)

.addSourceLine(this, getPC());

bug.addInt(getPC());

bugReporter.reportBug(bug);

}

}

}

}

1.3修改etc目录配置文件findbugs.xml和message.xml

不支持中文注释。

在findbugs.xml增加内容。

speed="fast"

reports="ALP_SYSTEMCLASS"

hidden="false"/>

Message.xml增加:

category:detector find System.out/System.error

please use log4j

]]>

short desc:System.out/error

class={0},method {1}long desc:System.out,please use log4j

detail info see log4j document

]]>

1.4用findbugs

点击bin/finbugs.bat,打开扫描的.class目录。看到扫描带System.out或者System.error的.class放到experimental类错误时,验证成功。

1.5替换eclipse findbugs-plugin.jar文件

用winrar打开

D:\devtools\eclipse_3.5.1\plugins\edu.umd.cs.findbugs.plugin.eclipse_1.3.9.20090821\findbugs-plugin.jar中message.xml,findbugs.xml,z加入二进制的edu.umd.cs.findbugs.detect.ForbiddenSystemClass。

重启elipse,还需要确保experimental类的错误能在findbugs窗口展现:windows->preferences->java->findbugs->reporter configuration上的experimental选项勾上。

执行findbugs扫描.class,看到结果出现..

java自定义findbugs规则,定制 findbugs规则 - 阿里巴巴一个测试架构师 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...相关推荐

  1. java软件测试经典案例,java语言编程案例 - Mrsjjl的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    1.编程实现:二分搜索算法 解答: public class SearchTest { /** 被搜索数据的大小 */ private static final int size = 5000000; ...

  2. java字母反过来_java之字母反转~~ - Plight - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    字符串的反转输出 这也是面试题中常考的一道.我们就以一个包含了全部26个英文字母,同时又具有完整含义的最短句子作为例子来完成解答.先来看一下这个句子: 引用 A quick brown fox jum ...

  3. java对import语句_Java的import语句 - 不积跬步,无以至千里 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    51Testing软件测试网]2S+K"rZ/bP*j 程序员可以使用两种import语句:51Testing软件测试网o$UN5EQh 3oZc4n f9P"CoQ;T]0单类型 ...

  4. java 测试排序_java排序的几种方法 - 善待自己的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    冒泡:publicclassBubbleSort { publicstaticvoidbubbleSort(int[] array) { intlength = array.length -1; fo ...

  5. Java帧率,android应用性能优化之帧率 - hellominefriend的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

    转自:http://www.cnblogs.com/myzh/archive/2013/03/17/2965225.html 1.纵观全局 对于顺畅度的分析,首先要知道一个整体情况,是局部,还是全局, ...

  6. Java码农怎样才能成为年薪60W的高级架构师进入BAT?

    怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名遭到BAT疯抢的架构师. 那么遭到BAT疯抢的架构师应该有怎样的技术知识体系,这不仅是一个刚刚踏入职场的初级程序员也是工作三五年之 ...

  7. 自学Java day41 图书管理系统-springboot快速开发 从jvav到架构师

    前端:html + css + jvavscript + vue + ajax + axios + element ui 后端:jvav + springboot + mybatisplus + my ...

  8. 【Java从0到架构师】Linux 应用 - 软件包管理、软件安装

    Linux 应用 - 软件包管理.软件安装 软件包管理器 rpm yum 软件的安装 jdk 1.8 mysql 5.7 tomcat8 Java 从 0 到架构师目录:[Java从0到架构师]学习记 ...

  9. 一个忙碌架构师的Java后端书架(2022)

    在这份书单里,我是这么一个同学:关心Java,关心架构,对文字有一定的洁癖:基础知识懂一些,但忙,不会花太多时间来研究算法和OS:需要掌握一个软件时会买一本XX in Action,但不买那种各式安装 ...

最新文章

  1. JAVA基本数据类型、数据类型转换
  2. 【阿里妈妈营销科学系列】第六篇:营销组合模型MMM
  3. 浅谈auto_ptr智能指针
  4. webservie报文格式
  5. 【操作系统】进程的异步性
  6. 大数据时代科研不能再两头花钱
  7. 人机交互-任务4:图形交互界面的设计(web)
  8. 为什么网站打得开,却ping不通, 网站却打得开
  9. 尚学堂视频笔记六:多线程
  10. 5G标准协议中的简写和缩略语
  11. 软件磁盘阵列(Software RAID)介绍
  12. 水仙花数的while方法
  13. 㳟祝202205026 gerrit 公司9周年生日
  14. 《python数据分析与挖掘》-步骤
  15. 内存占用过高的原因及解决方法
  16. 基于PreSCAN Matlab/Simulink的智能驾驶联合仿真【详细图文】
  17. 插上网线进入转发状态需要等30s,是什么问题?-网络热门问题分析
  18. Visio Viewer 无法打开 VSD文件 解决方法
  19. Error: error getting chaincode bytes: ‘go list‘ failed with: cannot find module providing package
  20. git 开发分支图解

热门文章

  1. PHP:函数赋参数默认初值
  2. cnBlog的windows live writer 客户端配置
  3. Ubuntu 9.10 ati HD 3470 显卡驱动 搞定
  4. Ubuntu之查看依赖软件
  5. Android kernel源码下载与编译
  6. 如何才能不被社会淘汰?一个程序员的七年之痒
  7. 深入理解Dalvik字节码指令及Smali文件
  8. android开发JNI之高级篇
  9. 细数AVPlayer的那些坑
  10. UE4之模型格式介绍