本文以文章《Java文件编译与反编译(一):javac命令和javap命令》为基础,进行深入分析 为了方便查看,此处将Test.class文件内容,进行如下调整: cafebabe0000003400130a0004000f09 000300100700110700120100016d0100 01490100063c696e69743e0100032829 56010004436f646501000f4c696e654e 756d6265725461626c65010003696e63 01000328294901000a536f7572636546 696c65010009546573742e6a6176610c 000700080c0005000601000454657374 0100106a6176612f6c616e672f4f626a 65637400210003000400000001000200 05000600000002000100070008000100 090000001d00010001000000052ab700 01b100000001000a0000000600010000 00010001000b000c000100090000001f 00020001000000072ab400020460ac00 000001000a0000000600010000000400 0100 0d00 0000 0200 0e Class类文件结构中的【表】: magiccafebabe 指魔数 minor_version00 00 指次版本号 major_version00 34指主版本号 constant_pool_count0013对应十进制为:19,表示常量池中有19-1=18项常量 constant_pool第1项常量: 0a对应十进制为:10代表 Methodref 0004对应十进制为:4指向常量池中声明方法的类描述符的索引项:4 00 0f对应十进制为:15指向常量池中名称及类型描述符的索引项:15 第2项常量: 09对应十进制为:9代表 Fieldref 00 03对应十进制为:3指向常量池中声明字段的类或接口的描述符的索引项:3 0010对应十进制为:16指向常量池中字段描述符的索引项:16 第3项常量: 07对应十进制为:7代表 Class 0011对应十进制为:17指向全限定名常量项的索引:17 第4项常量: 07对应十进制为:7代表 Class 0012对应十进制为:18指向全限定名常量项的索引:18 第5项常量: 01对应十进制为:1代表 UTF-8 0001对应十进制为:1UTF-8编码的字符串占用的字节数为:1 个字节 6d对应十进制为:109对应的ASCII值为:m 第6项常量: 01对应十进制为:1代表 UTF-8 0001对应十进制为:1UTF-8编码的字符串占用的字节数为: 1个字节 49对应十进制为:73对应的ASCII值为:I 第7项常量: 01对应十进制为:1代表 UTF-8 0006对应十进制为:6UTF-8编码的字符串占用的字节数为:6 个字节 3c 69 6e 69 74 3e对应的ASCII值为:<init> 第8项常量: 01对应十进制为:1代表 UTF-8 0003对应十进制为:3UTF-8编码的字符串占用的字节数为: 3个字节 28 29 56对应的ASCII值为:()V 第9项常量: 01对应十进制为:1代表 UTF-8 0004对应十进制为:4UTF-8编码的字符串占用的字节数为:4 个字节 43 6f 64 65对应的ASCII值为:Code 第10项常量: 01对应十进制为:1代表 UTF-8 000f对应十进制为:15UTF-8编码的字符串占用的字节数为: 15个字节 4c 69 6e 65 4e 75 6d 62 65 72 54 61 62 6c 65对应的ASCII值为:LineNumberTable 第11项常量: 01对应十进制为:1代表 UTF-8 0003对应十进制为:3UTF-8编码的字符串占用的字节数为: 3个字节 69 6e 63对应的ASCII值为:inc 第12项常量: 01对应十进制为:1代表 UTF-8 0003对应十进制为:3UTF-8编码的字符串占用的字节数为: 3个字节 28 29 49对应的ASCII值为:()I 第13项常量: 01对应十进制为:1代表 UTF-8 000a对应十进制为:10UTF-8编码的字符串占用的字节数为: 10个字节 53 6f 75 72 6365 46 69 6c 65对应的ASCII值为:SourceFile 第14项常量: 01对应十进制为:1代表 UTF-8 0009对应十进制为:9UTF-8编码的字符串占用的字节数为:9 个字节 54 65 73 74 2e 6a 61 76 61对应的ASCII值为:Test.java access_flag类或接口的访问标志00 21指类或接口的访问标志 代表ACC_PUBLIC(标志值0x0001)和ACC_SUPER(标志值0x0020) this_class00 03指常量池中类索引项为:3 super_class00 04指常量池中父类索引项为:4 interfaces_count00 00指接口计数器值为:0 interfaces指 接口索引集合(若该类没有实现任何接口,则接口计数器值为0,同时接口索引集合就不占用任何字节) fields_count00 01指字段计数器值为:1 fields指字段表集合 access_flags(u2)00 02指字段访问标志此值表示:ACC_PRIVATE 字段是否为private name_index(u2)00 05指字段的简单名称指向常量池中的索引项:5 descriptor_index(u2)00 06指字段和方法的描述符指向常量池中的索引项:6 attributes_count(u2)00 00指属性表计数器值为:0 attributes指属性表集合 methods_count00 02指方法计数器值为;2 methods指字段表集合 access_flags(u2)00 01指方法访问标志此值表示:ACC_PUBLIC 方法是否为public name_index(u2)00 07指方法名称索引指向常量池中的索引项:7 descriptor_index(u2)00 08指方法描述符索引指向常量池中的索引项:8 attributes_count(u2)00 01指属性表计数器值为:1 attributes指属性表集合 attributes_count00 01指属性表集合大小为:1(表示该类有1个属性) attributes指属性表集合 属性表的Code属性:
|
|