随笔-8  评论-67  文章-0  trackbacks-0
 1package bytecodeResearch;
 2
 3import java.io.BufferedInputStream;
 4import java.io.BufferedWriter;
 5import java.io.FileInputStream;
 6import java.io.FileWriter;
 7import java.io.IOException;
 8
 9public class ReadAndWriteClass {
10    
11    //16进制数字字符集 
12    private static String hexString = "0123456789ABCDEF"
13
14    /**
15     * 将字节数组的指定长度部分编码成16进制数字字符串
16     * @param buffer 待编码的字节数组
17     * @param length 指定的长度
18     * @return 编码后连接而成的字符串
19     */

20    public static String encode(byte[] buffer,int length) 
21    {     
22        StringBuilder sbr = new StringBuilder();
23        //将字节数组中每个字节拆解成2位16进制整数 
24        for(int i=0;i<length;i++
25        
26            sbr.append(hexString.charAt((buffer[i]&0xf0)>>4)); 
27            sbr.append(hexString.charAt(buffer[i]&0x0f)); 
28            sbr.append("  ");
29        }
 
30        return sbr.toString(); 
31    }
 
32    
33    /**
34     * 读取一个Class文件,将其所有字节转换为16进制整数,并以字符形式输出
35     * @param inputPath  输入文件的完整路径
36     * @param outputPath 输出文件的完整路径
37     * @throws IOException 读写过程中可能抛出的异常
38     */

39    public static void rwclass(String inputPath, String outputPath) throws IOException
40    {
41        //读取Class文件要用字节输入流
42        BufferedInputStream bis = new BufferedInputStream(
43                new FileInputStream(inputPath));
44        //输出转换后的文件要用字符输出流
45        BufferedWriter bw = new BufferedWriter(
46                new FileWriter(outputPath));
47        
48        int readSize = 16;
49        byte[] buffer_read = new byte[readSize];
50        String line;
51        String lineNumber = "0000000";
52        String strReplace;
53        int i = 0;
54        while ((readSize = bis.read(buffer_read,0,readSize))!= -1)
55        {
56            line = encode(buffer_read,readSize);
57            strReplace = Integer.toHexString(i);
58            lineNumber = lineNumber.substring(07-strReplace.length());
59            lineNumber = lineNumber+strReplace;
60            line = lineNumber+"0h: "+line;
61            bw.write(line);
62            bw.newLine();
63            i++;
64        }

65        bis.close();
66        bw.close();
67    }

68
69    /**
70     * 程序的入口方法
71     * @param args
72     * @throws IOException
73     */

74    public static void main(String[] args)
75    {
76        //指定输入、输出文件的完整路径
77        String inputPath = "L:/HelloWorld/HelloWorld.class";
78        String outputPath = "L:/HelloWorld/HelloWorld_ByteCode.txt";
79        
80        try {
81            rwclass(inputPath, outputPath);    
82            System.out.println("Successfully !");
83        }
 catch (IOException ioe) {
84            System.err.println("Something wrong with reading or writing !");
85            ioe.printStackTrace();            
86        }
    
87        
88    }

89
90}

91
posted on 2008-02-01 04:11 独孤求败 阅读(4562) 评论(5)  编辑  收藏 所属分类: Java ByteCode

评论:
# re: 一个读取Class文件的示例程序 2008-02-01 09:16 | astamei
这个就是一个读二进制文件吧?  回复  更多评论
  
# re: 一个读取Class文件的示例程序 2008-02-01 12:27 | 独孤求败
@astamei
是啊,实际上就是将一个二进制文件转换为十六进制文件
  回复  更多评论
  
# re: 一个读取Class文件的示例程序 2008-02-17 12:46 | 93ttu
好东西呀  回复  更多评论
  
# re: 一个读取Class文件的示例程序 2008-03-25 16:53 | 王跃峰
不知道博主还在写吗?我研究了下,写了程序要获取到class中的method的参数名称,目前只能得到方法描述.
一般是这样的
create(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
我现在想知道参数的名字啊,常量池中有这个名字的
怎样通过method_info联系到哪个参数名称?
求老大赐教.mail:wang.yue.feng@163.com  回复  更多评论
  
# re: 一个读取Class文件的示例程序 2010-02-16 06:04 | doon
好!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: