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++) { ; } } }
|
class文件
编译得到MyTest.class。
1 2 3 4
| vim -b SimpleClass.class
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
//////////// 常量池 /////////////
class
utf8 length=18 MyTest/SimpleClass | |
class
utf8 lengh16 java/lang/Object |
utf8 length=6 <init>
utf8 length=3 ()V
utf8 length=3 Code
md_ref
nam&ty
utf8 length=3 dfd
utf8 length=13 StackMapTable
//////////// 常量池 /////////////
0021 0001 0003 可能是public
// 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
0001 attrib_count
0007 00000011 0001 0001 00000005 2ab70008b1 0000 0000
// 代码是存储在Class文件中的method的code属性的code[]数组中
//////////////// 第二个method dfd() ///////////
0000 000a 0006 没写access_flag
0001 attrib_count
0007 00000028 0002 0002 0000000f 033ca700068401011b1064a1fffab1
0000 exception_table_length
0001 attribute_count
000b 00000007 0002 fc00 0501 0200 00
|
疑问
.和:是怎么区分的?
其他阅读
http://coolshell.cn/articles/9229.html