在孤独中享受寂寞 在寂寞中厮杀黎明
One java world , One java fan !
BlogJava
首页
新随笔
联系
聚合
管理
随笔-9 评论-63 文章-0 trackbacks-0
一个读取Class文件的示例程序
1
package
bytecodeResearch;
2
3
import
java.io.BufferedInputStream;
4
import
java.io.BufferedWriter;
5
import
java.io.FileInputStream;
6
import
java.io.FileWriter;
7
import
java.io.IOException;
8
9
public
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(
0
,
7
-
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
独孤求败
阅读(1746)
评论(4)
编辑
收藏
所属分类:
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
回复
更多评论
新闻频道
新用户注册
刷新评论列表
标题
姓名
主页
验证码
*
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2008-02-03 14:17 编辑过
相关链接:
网站导航:
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理博客
教师博客
天文博客
汽车博客
足球博客
股票博客
电子博客
管理
相关文章:
一个解析Java Class文件的实例
Class文件格式解析
一个读取Class文件的示例程序
<
2008年9月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(5)
给我留言
查看公开留言
查看私人留言
随笔分类
(6)
Apache Ant 使用例程
Design Pattern
Inside JVM学习笔记
Java ByteCode(3)
Java JDK 学习笔记(2)
Java 技术(1)
ObjectWeb ASM 操纵例程
随笔档案
(9)
2008年7月 (3)
2008年6月 (3)
2008年2月 (3)
文章分类
Java人生
笛箫情缘
搜索
积分与排名
积分 - 15499
排名 - 498
最新随笔
1. 如何让同一个虚拟机运行两个程序A和B,其中B程序是由A程序在运行过程中新生成的?
2. Java标准类库提供的容器总结
3. Java中类型与类的区别
4. 发现一个很好的专题:实时 Java 系列
5. Java程序动态分析工具有哪些?
6. 编程该学些啥?
7. 一个解析Java Class文件的实例
8. Class文件格式解析
9. 一个读取Class文件的示例程序
最新评论
1. re: Class文件格式解析
@几岁j
好过分的要求啊!
不过,我也不客气地说,请你滚蛋,这里不欢迎你!
--独孤求败
2. re: Class文件格式解析
请把音乐关了,烦死了
--几岁j
3. re: 如何让同一个虚拟机运行两个程序A和B,其中B程序是由A程序在运行过程中新生成的?
@zhuxing
动态加载?如何做哈?
--独孤求败
4. re: 如何让同一个虚拟机运行两个程序A和B,其中B程序是由A程序在运行过程中新生成的?
@独孤求败
那就动态加载你的类,然后创建实例执行或者反射调用都可以
--zhuxing
5. re: 如何让同一个虚拟机运行两个程序A和B,其中B程序是由A程序在运行过程中新生成的?
@zhuxing
没有main入口,不过想加一个入口也容易...
--独孤求败
6. re: 如何让同一个虚拟机运行两个程序A和B,其中B程序是由A程序在运行过程中新生成的?
你说的这个B程序,是有main入口的那种?
还是,你只是产生了类,想动态加载然后反射调用类?
--zhuxing
7. re: 如何让同一个虚拟机运行两个程序A和B,其中B程序是由A程序在运行过程中新生成的?
@zhuxing
B程序是A程序运行过程中,临时生成的!
现在想运行B程序,得到B程序的运行结果,并反馈给A程序.
如何实现?
--独孤求败
8. re: 如何让同一个虚拟机运行两个程序A和B,其中B程序是由A程序在运行过程中新生成的?
评论内容较长,点击标题查看
--zhuxing
9. re: 如何让同一个虚拟机运行两个程序A和B,其中B程序是由A程序在运行过程中新生成的?
多线程呀。
--隔叶黄莺
10. re: Java标准类库提供的容器总结
写的不错
--代理163
阅读排行榜
1. Class文件格式解析(4091)
2. 一个解析Java Class文件的实例(1839)
3. 一个读取Class文件的示例程序(1746)
4. Java标准类库提供的容器总结(1501)
5. 编程该学些啥?(1497)
评论排行榜
1. 一个解析Java Class文件的实例(29)
2. Java程序动态分析工具有哪些?(7)
3. 如何让同一个虚拟机运行两个程序A和B,其中B程序是由A程序在运行过程中新生成的?(7)
4. Class文件格式解析(6)
5. Java中类型与类的区别(5)