0%

java系列 - class文件

introduction

目的:完整分析class文件。

java源码

1
2
3
4
5
6
7
8
9
10
package MyTest;

public class SimpleClass {
void dfd() {
int i;
for (i = 0; i < 100; i++) {
; // Loop body is empty
}
}
}

class文件

编译得到MyTest.class。

1
2
3
4
# 16进制查看文件
vim -b SimpleClass.class
# 16进制和ascii码对应的显示结果
hexdump -C SimpleClass.class
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
cafe babe  | 0000   0033      000c                   
magic num | minor0 major51 常量池计数器11+1=12

//////////// 常量池 /////////////

#1 07 0002
class #2

#2 01 0012 4d79 5465 7374 2f53 696d 706c 6543 6c61 7373
utf8 length=18 MyTest/SimpleClass | |

#3 07 0004
class #4 // java/lang/Object

#4 01 0010 6a61 7661 2f6c 616e 672f 4f62 6a65 6374 |
utf8 lengh16 java/lang/Object |

#5 01 0006 3c 696e 6974 3e
utf8 length=6 <init>

#6 01 0003 2829 56
utf8 length=3 ()V

#7 01 0004 436f 6465
utf8 length=3 Code

#8 0a 000300 09
md_ref #3. #9 // java/lang/Object."<init>":()V

#9 0c 0005 0006
nam&ty #5 #6 // "<init>":()V

#10 01 0003 64 6664
utf8 length=3 dfd

#11 01 000d 53 7461 636b 4d61 7054 6162 6c65
utf8 length=13 StackMapTable

//////////// 常量池 /////////////

0021 0001 0003
可能是public #1 类索引 #3 父类索引

// 0x0021=0x0001|0x0020 也即ACC_PUBLIC 和 ACC_SUPER为真,其中ACC_PUBLIC大家好理解,ACC_SUPER是jdk1.2之后编译的类都会带有的标志。

0000
接口计数器 接口表

0000
fields_count

0002
methods_count

//////////////// 第一个method void <init> ///////////

0001 0005 0006
public #5<init> #6()V 其值为()V,表示<init>方法没有参数和返回值, 其实这是编译器自动生成 的实例构造器方法

0001
attrib_count

0007 00000011 0001 0001 00000005 2ab70008b1 0000 0000
#7Code属性 attrib_len max_stack max_locals code_length code[] exception_table_length attribute_count
// 代码是存储在Class文件中的method的code属性的code[]数组中



//////////////// 第二个method dfd() ///////////

0000 000a 0006
没写access_flag #10,dfd ()V

0001
attrib_count

0007 00000028 0002 0002 0000000f 033ca700068401011b1064a1fffab1
#7Code属性 属性表的长度 max_stack max_locals code_length=15 code[],解析见《jvm spec》41页

0000
exception_table_length

0001
attribute_count

000b 00000007 0002 fc00 0501 0200 00
#11:StackMapTable length num_of_entries 7个length的stack_map_frame

疑问

.和:是怎么区分的?

其他阅读

http://coolshell.cn/articles/9229.html