文章目录
class装载验证流程
class装载验证流程
加载
链接(验证、准备、解析)
初始化
class装载验证流程 -加载
装载类的第一个阶段
取得类的二进制流
转为方法区数据结构
在Java堆中生成对应的java.lang.Class对象
class装载验证流程 -链接 验证
链接 -> 验证
目的:保证Class流的格式是正确的
文件格式的验证
是否以0xCAFEBABE开头
版本号是否合理
元数据验证(class文件简单语义的验证)
是否有父类(比如某个类继承了某个类,可是这个类根本就是不存在的。)
继承了final类?(继承了final的方法或者修改了final属性)
非抽象类实现了所有的抽象方法(非抽象类实现接口中所有的非抽象方法)
字节码验证 (很复杂)
运行检查
栈数据类型和操作码数据参数吻合(分配了两个字的空间,可是运行的时候可能不只是两个字、分配了两个局部变量,可是运行的时候发现很多的局部变量)
跳转指令指定到合理的位置(跳转至零跳转到字节码的一个偏移量上面,比如本来就五十个字节,结果跳转到第五十一个字节上去了。)
符号引用验证
常量池中描述类是否存在(比如一个类继承了某个类,可是这个接口或者类实际上是不存在。)
访问的方法或字段是否存在且有足够的权限(访问的方法或者字段的权限是否足够(public private等))
class装载验证流程 -链接 准备
链接 -> 准备
分配内存,并为类设置初始值 (方法区中)
public static int v=1;
在准备阶段中,v会被设置为0
在初始化的中才会被设置为1
对于static final类型,在准备阶段就会被赋上正确的值
public static final int v=1;
class装载验证流程 -链接 解析
链接 -> 解析
符号引用替换为直接引用
符号引用就是字符串,默认的超类就是java.lang.Object,符号引用就是在常亮池里面有个字符串,字符串的内容就是java.lang.Object,符号引用并不能被用,只是一种表示的方式,直接就是指针或者地址偏移量,因为最后一定是指向一个内存地址,替换为直接引用之后,class才能够用自己需要引用的内容。
符号引用:字符串引用对象不一定被加载
直接引用:指针或者地址偏移量引用对象一定在内存