java代码分析及分析工具
一个项目从搭建开始,开发的初期往往思路比较清晰,代码也比较清晰。随着时间的推移,业务越来越复杂。代码也就面临着耦合,冗余,甚至杂乱,到最后谁都不敢碰。
作为一个互联网电子商务网站的业务支撑系统,业务复杂不言而喻。从09年开始一直沿用到现在,中间代码经过了多少人的手,留下了多少的坑,已经记不清楚了,谁也说不清了。
代码的维护成本越来越高。代码已经急需做调整和改善。最近项目组专门设立了一个小组,利用业余时间做代码分析的工作,目标对核心代码进行分析并进行设计重构。
代码分析如果用人工来做,需要两点:1、开发人员代码造诣要求很高。2、开发人员投入时间成本非常大。
然而现在网络上 Java代码分析工具做的比较好。所以考虑开始利用这些工具对代码进行分析,并做修改。当然最好在最后有个资深人士做相关的review或开发人员自检。
先考虑工具吧,工欲善其事,必先利其器。所以决定search一下,代码分析和代码分析的工具,便于更好的利用和进行。
学习一下并做一些归纳:
提到静态代码的概念:个人理解为 不需要运行起来的代码所关注的点。就是就代码看代码,语法、结构、接口、类等。
整个软件开发生命周期中,网上说30% 至 70% (占有量还是很大的)的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。看来效果还是很明显的。
静态代码分析的好处,的确有很多好处:
1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。
2. 帮助代码设计人员更专注于分析和解决代码设计缺陷。
3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本
概念不多提了,看工具:
1、findbugs:
安装教程:http://sourceforge.net/projects/findbugs/
看使用体验:针对一个项目启动findbugs,会进入findbugs的工作视图

如上图
蓝色区域:罗列出了findbugs在代码中检测到的代码问题。同样的红色为严重的,黄色为警告。
由于自己写的学习项目所以代码不庞大,质量也还行,所以检测出来的都是黄色警告的。
紫色区域:点击对应的检测点,能定位到问题代码具体的位置,并且在左边有个bug虫子给出具体问题的信息
绿色区域:对应左边蓝色区域的检测点,给出的详细描述和建议。
个人觉得findbugs对于代码检测的深度力度要更好。比如,子类名和父类名相同,死存储(没有调用却开辟空间的),一个方法没有对参数对象验证空等等。
对代码的质量检查做的很到位。而且很清晰。当然findbugs 也有自定义的设置,个人觉得现有功能已经很好用了,不需要自定义。
2、Checkstyle :
安装:http://sourceforge.net/projects/eclipse-cs/files/latest/download下载插件,links plugin的方式安装到eclipse中
重点看使用体验:针对一个项目启动checkStyle之后

刚检测完,项目所有类都泛黄,甚至有的类打上了小红叉。静心仔细的看下:
提示有:public修饰符多余,一行超过80个字符,缺少文档注释,魔法数字等等等等。出现中文代码的地方会直接打红叉。非常精细。
蓝色区域:包括Errors和warnings。Errors重点列出了代码中的问题,比如代码中有中文等等,Warnings:一般是代码风格不好的地方。比如代码
最后一行加注释算是不好的风格
紫色区域:发现用于特定的注释分割,很多注释都有问题,和eclipse自动格式化有冲突,我觉得可以是忽略的。左边的小放大镜有详细的不规范信息。
个人觉得检查的精度还是很细的,但是对于注解等的检测过于精细,很扰乱视眼。Errors级别就可以了。和eclipse的格式化有很多的冲突。导致很多也是不必要的检验。
当然,也是可以自定义设置检测项,如下:

这样可以把注释的或者和日常格式化有问题的检查撤销掉。主要检查代码的问题。不过说实话这个设置起来还是很麻烦的,我觉得还不如将就着看所有的提示
信息。不需要改的就人为忽略吧。重点关注Errors。从中看出,这款其实主要侧重的还是代码的风格的检测。
3、PMD
下载安装:http://sourceforge.net/projects/pmd/files/pmd-eclipse
安装完成,针对一个项目启用PMD检测,进入pmd工作视图

如上图:
蓝色区域:是汇总的有问题的代码,pmd将代码分析完之后的级别划分的更细致了,就是5个小圈对应:error high, error, warning high, warning,infomation。
绿色区域:定位,并且给出问题描述。
这款代码检测软件应该说是和findbugs是属于一种类型的。在我检测的代码中,被pmd标记最多的是代码中有system.out.println() ,的确在正式项目中不应出现这种语句。
同样方法的大小写是否符合规范也会检查出来。在代码检测中也更多的关注error high,error。
另一方面pmd插件有20M大小,说明他的检测会很细致,也很广泛。
总结
对于工具的探索就到这,因为我觉得这三款工具对于现在项目的检测力度已经够用了。而jtest由于是商业非开源产品,就不去下载破解版验证了。
现在对以上工具进行一下总结:
findbugs:非常好用的一款代码检测工具,检测的深度比较深,对代码中渗透的性能,内存的使用释放有很好的检测。能检测出可能导致错误的代码,如空指针引用等等。
我觉得这款检测工具应该是首选必备的。
checkstyle:顾名思义,他就是一款检测代码风格样式的工具,对ccs都会有检测,可以用以辅助提高开发过程中的代码风格。缺点很多检测过于细致和格式化冲突,
比如注释都会高亮显示,很扰乱视线,所以使用时候组号可以做自定义的风格规范。对代码的bug发现力度较弱。
PMD:20M大小,说明他的检测非常的广,在我看来的确也是,system.out.println 也会做为error提示。一些命名的检测等。的确并不是代码的bug,
而是项目中代码的规范检测。深度没有findbugs深,在使用findbugs的情况下,可以配合pmd来检测一些不规范的代码。
能通过以上这三款软件的检测,并加上业务代码的review。相信代码的质量级别应该是很高了,相信也能很好的满足日常的开发和后期的维护了。
java代码分析及分析工具的更多相关文章
- java代码行数统计工具类
package com.syl.demo.test; import java.io.*; /** * java代码行数统计工具类 * Created by 孙义朗 on 2017/11/17 0017 ...
- 利用StopWatch类监控Java代码执行时间并分析性能
springframework中的StopWatch类可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间.一般用来测量代码执行所用的时间或者计算性能数据,在优化代码性能上可以使用Sto ...
- StopWatch 监控Java代码运行时间和分析性能
背景 有时我们在做开发的时候需要记录每个任务执行时间,或者记录一段代码执行时间,最简单的方法就是打印当前时间与执行完时间的差值,然后这样如果执行大量测试的话就很麻烦,并且不直观,如果想对执行的时间做进 ...
- 通过 thread dump 分析找到高CPU耗用与内存溢出的Java代码
http://heylinux.com/archives/1085.html通过 thread dump 分析找到高CPU耗用与内存溢出的Java代码 首先,要感谢我的好朋友 钊花 的经验分享. 相信 ...
- Java太阳系小游戏分析和源代码
Java太阳系小游戏分析和源代码 -20150809 近期看了面向对象的一些知识.然后跟着老师的解说做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下近期学的知识: 用到知识点:类的继承.方法的重载 ...
- 【Java线程与内存分析工具】VisualVM与MAT简明教程
目录 前言 VisualVM 安装与配置 本地使用 远程监控 MAT 使用场景 安装与配置 获得堆转储文件 分析堆转储文件 窥探对象内存值 堆转储文件对比分析 总结 前言 本文将简要介绍Java线程与 ...
- [JavaEE]Java NIO原理图文分析及代码实现
转http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 2. java NIO ...
- 分析和解析PHP代码的7大工具
PHP已成为时下最热门的编程语言之一,然而却有许多PHP程序员苦恼找不到合适的工具来帮助自己分析和解析PHP代码.今天小编就为大家介绍几个非常不错的工具,来帮助程序员们提高自己的工作效率,一起来看看吧 ...
- Java NIO原理图文分析及代码实现
原文: http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 2. java ...
随机推荐
- Python模块之shelve
shelve是python的自带model. 可以直接通过import shelve来引用. shelve类似于一个存储持久化对象的持久化字典,即字典文件. 使用方法也类似于字典. 保存对象至shel ...
- ossim 4.1 安装
在这说明一下,本人也是第一次安装这东东很多我自己也不懂,只能把自己的安装步骤通过贴图呈现出来了!!!! 我用root用户登录的,顺便查看ip 在浏览器打开网址https://192.168.86.15 ...
- Spark 编程模型(上)
Spark的编程模型 核心概念(注意对比MR里的概念来学习) Spark Application的组成 Spark Application基本概念 Spark Application编程模型 回顾sc ...
- 关于raid5的一系列问题
前几天我的一个同事在对计划采购的存储进行测试,期间聊到了raid5的话题,我和他的意见产生了分歧.他的说法是raid5不能挂太多盘是因为如果挂太多盘写惩罚会非常严重导致性能下降.而我的观点则是对于ra ...
- Spring 学习之AOP
1. 走进面前切面编程 编程范式: 面向过程编程,c语言: 面向对象编程:c++,java,c#; 函数式编程: 事件驱动编程: 面向切面编程: AOP是一种编程范式,不是编程语言:解决特定问题,不能 ...
- Trace VM
24小时稳定性压测Trace 高并发情况下主要观察VM运行情况 一.总体概览 如上图所示 持久代十分稳定,没有发生OOM 二.VM区域详情 上图为VM每个区间的具体情况 1.持久代始终占分配空间的四分 ...
- JPA和Hibernate到底是什么关系???
转自:https://www.cnblogs.com/mosoner/p/9494250.html 在学习框架的过程中,发现学的东西很多,但是感觉他们之间的联系区别都不是很了解,知道JPA可以去实现持 ...
- MySQL设置快速删除
SET FOREIGN_KEY_CHECKS=0; DROP DATABASE ... SET FOREIGN_KEY_CHECKS=1;
- UI5-文档-3-Hello World!
通过本教程,您将了解如何在单个HTML页面上通过几个步骤创建一个简单的第一个应用程序. 我们创建了一个带有两个页面和导航按钮的应用程序来在页面之间导航. 预览 Simple "Hello W ...
- linux 中特殊符号用法详解
# 井号 (comments)#管理员 $普通用户 脚本中 #!/bin/bash #!/bin/sh井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行 ...