class 文件是一组以 8 位字节位基础单位的二进制流,采用一种类似 C 语言结构体的伪结构来存储数据,这种伪结构只有两种数据类型:无符号数和表。无符号数属于基本的数据类型,以 u1、u2、u4、u8 分别代表1个字节、2个字节、4个字节、8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或 utf-8 编码构成的字符串值。表是由多个无符号数或其它表作为数据项构成的复合数据类型,所有表都习惯性地以 _info 结尾。 每一个 class 文件对应于一个如下所示的 ClassFile 结构体:
ClassFile {
u4 magic;//魔数
u2 minor_version;//副版本号
u2 major_version;//主版本号
u2 constant_pool_count;//常量池计数器,
cp_info constant_pool[constant_pool_count-1];//常量池列表
u2 access_flags;//访问标志
u2 this_class;//类索引,表示这个Class文件所定义的类或接口
u2 super_class;//父类索引
u2 interfaces_count;//接口计数器
u2 interfaces[interfaces_count];//接口表,接口顺序和源代码顺序一致
u2 fields_count;//字段计数器
field_info fields[fields_count];//字段表
u2 methods_count;//方法计数器
method_info methods[methods_count];//方法表
u2 attributes_count;//属性计数器
attribute_info attributes[attributes_count];//属性表
}
更直观地,通过图片来展示 class 文件的结构,如下所示:
从上面的介绍 class 文件的结构比较复杂,事实上,我们可以将 class 文件分为以下部分。
class文件: 文件描述、常量池、类概述、字段表、方法表、扩展信息表。为了便于读者理解,在此,我们先来看一个实例,Java 源码如下:
publicclassTest{
privateString attribute_1;
privateInteger attribute_2;
publicvoidtestMethod_1(){
}publicStringtestMethod_2(String param){
returnparam;
}}
通过命令“javac Test.java”编译后,可以得到 Test.class 文件,这就是所谓的字节码文件,Test.class 内容如下所示:
cafebabe00000032001807000201001e636f6d2f746573742f646f632f6578702f546573
74436c617373436f64650700040100106a6176612f6c616e672f4f626a65637401000b61
74747269627574655f310100124c6a6176612f6c616e672f537472696e673b01000b6174
747269627574655f320100134c6a6176612f6c616e672f496e74656765723b0100063c69
6e69743e010003282956010004436f64650a0003000d0c0009000a01000f4c696e654e75
6d6265725461626c650100124c6f63616c5661726961626c655461626c65010004746869
730100204c636f6d2f746573742f646f632f6578702f54657374436c617373436f64653b
01000f74657374496e746572666163655f3101000f74657374496e746572666163655f32
010026284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f5374
72696e673b010005706172616d01000a536f7572636546696c6501001254657374436c61
7373436f64652e6a61766100210001000300000002000200050006000000040007000800
00000300010009000a0001000b0000002f00010001000000052ab7000cb100000002000e
00000006000100000003000f0000000c00010000000500100011000000010012000a0001
000b0000002b0000000100000001b100000002000e0000000600010000000b000f000000
0c0001000000010010001100000001001300140001000b0000003600010002000000022b
b000000002000e0000000600010000000e000f0000001600020000000200100011000000
00000200150006000100010016000000020017
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。