类文件结构
类型 名称 数量 描述
———————————————————————————————————————————
u4 魔数 (magic) 1 标识这个文件是否是一个能被虚拟机接受的Class文件
u2 次版本号(minor_version) 1
u2 主版本号(major_version) 1
u2 常量池容量计数值(constant_pool_count)1
cp_info 常量池(constant_pool) constant_pool_count-1 存放字面量和符号引用
u2 访问标志(access_flags) 1 标识类或接口的访问信息(类还是接口、是否public、是否abstract、final等)
u2 类索引(this_class) 1 确定类的全限定名————|
u2 父类索引(super_class) 1 确定父类的全限定名——|————确定类的继承关系
u2 接口索引计数(interfaces_count)1———————————————————————————————|
u2 接口索引集合(interface) interfaces_count 接口索引集合 ——————|
u2 字段表集合计数(fields_count) 1
field_info 字段表集合(fields) fields_count 描述类或接口中声明的变量
u2 方法表计数(methods_count) 1
method_info 方法表集合(method) methods_count 描述类中的方法
u2 属性表计数(attributes_count)1
attribute_info 属性表集合(attributes)attributes_count code、ConstantValue等
类加载的过程
加载:根据类的全限定名读取类的二进制字节流转化为方法区的类型结构,并在java堆中创建该类的Class对象作为方法区类型结构的访问入口
校验:校验类型结构是否符合Java虚拟机规范,例如,校验Class文件结构,运行该类是否会危害虚拟机自身安全(校验Code属性)
准备:给类变量分配内存并赋初始值
解析:将常量池的符号引用转化为直接引用
初始化:执行类构造器的
怎样确保类的唯一性?
类的唯一性是由类和类加载器共同确定
三层类加载器:
启动类加载器:加载
扩展类加载器:加载
应用类加载器:加载ClassPath下的类
自定义类加载器
双亲委派模型
类加载器会先委派父类进行类加载,如果父类无法加载再由子类进行加载,该模型下任何一个类加载请求都应该传送到启动类加载器,保证了类的优先级层次,确保了类的唯一性



