標籤:方法行數 函數大小
今天想對一個java項目超過100行的方法進行一些代碼最佳化。需要統計一下項目中的java類有哪些方法的代碼超過了100行。在網上沒找到類似的統計工具,就自己寫了段代碼進行統計。
編碼思路:因為一個java類,最外層的{}可以標識類,次外層的{}就是方法或內部類了。為了便於編碼,我把內部類也當作方法處理了。只要把次外層的{和}配對就是一個完整的方法了。因此我用先進後出的棧儲存一個數組。數組的第一個元素是某個方法起始行,第二個元素是該行的行號。這樣既能通過行號相減得到方法的行數,又能記錄方法的位置。
具體代碼如下:
package query;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Stack;
public class StatNumForMethod {
public static void main(String[] args) {
File dir = new File("E:/workspace/XXX/src/main/java/");//要統計的java包的絕對路徑
ergodicDir(dir);
}
/**
* 遍曆目錄下的所有java檔案
* @param dir
*/
private static void ergodicDir(File dir) {
if(dir.isDirectory()){
for(File file : dir.listFiles()){
if(file.isDirectory()){
ergodicDir(file);
}
if(file.isFile() && file.getName().endsWith("java")){
statInFile(file);
}
}
}
}
private static void statInFile(File file) {
BufferedReader reader = null;
try {
//讀一個檔案輸入資料流
reader = new BufferedReader(new FileReader(file));
String line = null;
Stack<String[]> stack = new Stack<String[]>();
int lineNum = 0;
while((line=reader.readLine()) != null){//遍曆行
lineNum++;
//遇到{時把當前行和行號作為數組的元素進棧,遇到}時計算出方法的行數並列印行,出棧
int matchNum = getOccur(line, "{")-getOccur(line, "}");//一行可能有多個{或}
if(matchNum > 0){
for(int i=0;i<matchNum;i++){
stack.push(new String[]{line, lineNum+""});
}
}else{
for(int i=0;i<-matchNum;i++){
if(stack.isEmpty()){
System.out.println(file.getName()+"檔案的{}不匹配,不能統計行數。。。當前的行號是"+lineNum);
return;
}
String[] popArr = stack.pop();
if(stack.size()==1){//當棧大小為1時說明一個方法結束了
int beginNum = Integer.parseInt(popArr[1]);//方法開始的行號
if(lineNum-beginNum >100){//方法內的代碼超過100行
System.out.println(file.getName()+"檔案的"+popArr[0]+"方法(第"+beginNum+"行)多達"+(lineNum-beginNum+1)+"行");
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* src 源,find 尋找目標,返回的就是找到的數目
* @param src 源
* @param find 尋找目標
* @return 找到的數目
*/
private static int getOccur(String src, String find) {
int o = 0;
int index = -1;
while ((index = src.indexOf(find, index)) > -1) {
++index;
++o;
}
return o;
}
}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
統計java方法(函數)的程式碼數