全限定名有绝对路径的意思,比如一个文件file的存放路径,其绝对路径可能是/usr/local/sbin/file;
一.Class文件结构
1.魔数
每个class头四个字节为魔数,唯一的 是确定这个文件是否是一个能够被虚拟机接受的文件
2.class文件的版本号
如果版本号超过虚拟机的版本号,那么这个class文件将会被拒绝执行
3.常量池
存放的是字面量和符号引用
字面量是文本字符串和声明为final的常量值
符号引用包括
- 类和接口的全限定名
- 字段的名称和描述符
- 方法的名称和描述符
4.访问标志
识别一些类或者接口层次的访问信息
包括这个class是类还是接口,是否为public或者abstract,如果是类的话是否声明为final等等
5.当前类索引 父类索引 和接口索引集合
当前类索引是为了确定当前类的全限定名,父类索引是为了确定父类的全限定名
接口索引集合是为了确定这个类实现了那些接口 ,这些被实现的接口将按 implements
(如果这个类本身是接口的话则是extends
) 后的接口顺序从左到右排列在接口索引集合中。
6.字段表集合
用来描述类和接口中的变量 不包括局部变量
7.方法表集合
描述类和接口中的方法
8.属性表集合
二.类的加载过程
1.加载
通过全类名获取定义此类的二进制字节流
将字节流代表的静态存储结构转换为方法区的运行时数据结构 ,并放进方法区
在内存中生成一个代表该类的class对象,用于作为方法区这些数据的访问入口
2.连接(分为验证 准备 解析)
验证
验证是连接阶段的第一步,确保class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全
准备 是为类变量分配内存并设置初始值的阶段 这些内存都将在方法区中分配
- 这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量会在对象实例化时随着对象一块分配在 分fe堆中。
- 这里所设置的初始值"通常情况"*(注意这个通常情况)下是数据类型默认的零值(如0、0L、null、false等
解析
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符7类符号引用进行。
虚拟机将运行时常量池中那些仅代表其他信息的符号引用解析为直接指向所需信息所在地址的指针。
3.初始化
给已经分配内存的static修饰的赋初始值
初始化是类加载的最后一步,也是真正执行类中定义的 Java 程序代码(字节码),初始化阶段是执行初始化方法 <clinit> ()
方法的过程