查找jar包中.class文件關鍵字(變量名,字符串)


有時查看日志,常常會發現由框架底層打印的錯誤日志。要修改這個錯誤的時候,如果不是對框架特別熟悉,就需要按照可能產生這個錯誤日志的流程一步一步找,一時半會不一定能找到。比如本人最近對smartfoxserver搭建的服務器做壓測的時候,發現最大等待線程數超過20就會打印錯誤日志,然后就一直在smartfoxserver接受請求的反編譯代碼里找該錯誤輸出,花了很長時間一直沒找到。然后我在想能否用inputstream來查詢字符串,試驗代碼如下:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;

public class Find {
    public static final String path = "D:/workspace/test/"; //jar包父目錄
    public static final String keywords = "aaa"; //關鍵字
    public static void main(String[] args){
        File file = new File(path);
        final Pattern p = Pattern.compile(".+\\.jar$");
        File[] files = file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if(p.matcher(pathname.getPath()).matches()){
                    return true;
                }else{
                    return false;                    
                }
            }
        });
        
        search(files);
    }
    
    private static void search(File[] files){
        try{
            for(File f : files){
                if(f.isDirectory()){
                    search(f.listFiles());
                }else{
                    ZipFile jar = new ZipFile(f);
                    Enumeration enumration = jar.entries();
                    while(enumration.hasMoreElements()){
                        ZipEntry zipEntry = (ZipEntry)enumration.nextElement();
                        
                        InputStreamReader isr = new InputStreamReader(jar.getInputStream(zipEntry));
                        BufferedReader br = new BufferedReader(isr);
                        String line = br.readLine();
                        int line_num = 1;
                        while(null != line){
//                            System.out.println(line);
                            if(line.contains(keywords)){
                                System.out.println(f.getPath() + ","  +zipEntry.getName() + "," + "line number = " + line_num);
                            }
                            line = br.readLine();
                            line_num++;
                        }
                    }
                }
            }
        }catch(ZipException z_e){
            z_e.printStackTrace();
        }catch(IOException io_e){
            io_e.printStackTrace();
        }
    }
}

 

用於測試的jar包:D:\workspace\test\test.jar  代碼如下
Test.java:

public class Test {
    public static void main(String[] args){
        System.out.print("aaa");
    }
}

測試結果如下:

 

D:\workspace\test\test.jar,com/test/Test.class,line number = 3

 

以上代碼沒有反編譯相關的,所以目前只對查詢字符串或者變量名有效,對方法名不一定能查出來  有時間可以研究下反編譯解析

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM