.class文件的作用
java程序通过javac编译后,生成对应的.class文件,也称作字节码文件。.class文件与类对应,每个类都会生成一个对应的.class文件,用来记录该类的信息。
.class文件的结构有很严格的规范,所以一个.class可以在任意架构的CPU和系统的JVM上被读取加载,这也是java “一次编写各处运行” 的原因。
.class文件整体结构
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; //当前类
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文件中存放的内容
JVM的规范规定,.class文件中有两种数据结构组成:无符号数、表
(1) 无符号数:基本数据类型,u1、u2、u4、u8分别代表1字节、2字节、4字节、8字节的无符号数,可以用来描述数字、索引引用、数量值或者按照utf8编码构成的字符串;比如上面结构中的u2 minor_version,表示用2个字节的长度存储次版本号,这两个字节16位的值就是次版本号的值;
(2) 表:由多个无符号数或其他表作为元素构成的复合型数据类型,一般习惯性用“_info”结尾;比如cp_info就是存放常量的表(数组);表也可以理解为数组
查看.class文件
比如有如下代码:
class A{
public static void main(String args[]){
int a = 10;
}
}
生成对应的A.class后并打开,可以看到如下内容