zoukankan      html  css  js  c++  java
  • 查找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 est est.jar  代码如下
    Test.java:

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

    测试结果如下:

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

    以上代码没有反编译相关的,所以目前只对查询字符串或者变量名有效,对方法名不一定能查出来  有时间可以研究下反编译解析

  • 相关阅读:
    C代码调用Java代码
    简易的美图秀秀利用别人的so库
    C代码输出日志
    JAVA向C传递数据
    JNI使用常见错误
    JNI的开发步骤
    NDk的目录
    交叉编译
    jquery的一点点认识
    [效率提升]工作中的那些命令行
  • 原文地址:https://www.cnblogs.com/hithlb/p/3906151.html
Copyright © 2011-2022 走看看