java的类加载过程

在这里插入图片描述
具体步骤:载入,验证,准备,解析,初始化
1.载入
:
JVM在该阶段把数据源(.class文件,jar包,网络等)转换为二进制字节流,并生成一个代表该类的java.lang.Class对象

2.验证
jvm对字节流文件进行检验(
确保二进制字节流格式符合预期(比如说是否以 cafe babe 开头)。
是否所有方法都遵守访问控制关键字的限定。
方法调用的参数个数和类型是否正确。
确保变量在使用之前被正确初始化了。
检查变量是否被赋予恰当类型的值。
),看它是否符合规范

3.准备阶段
对类变量(静态变量, 由static修饰) 进行内存分配及初始化(0,0L,true ,false等).
比如:
在这里插入图片描述
f不会分配内存,
而j和c会,
但 j 在准备阶段的值是null;
c由于是final 修饰的 ,一旦赋值便不可更改,所以 c 的值是"静态常量"

4, 解析阶段
将常量池中的符号引用转化为直接引用

直接引用:直接引用是和虚拟机实现的内存布局相关的。如果有了直接引用,那引用的目标必定已经在内存中存在。
符号引用以一组符号(任何形式的字面量,只要在使用时能够无歧义的定位到目标即可)来描述所引用的目标。在编译时,Java 类并不知道所引用的类的实际地址,因此只能使用符号引用来代替.
符号引用与虚拟机实现的内存布局无关,引用的目标并不一定已经加载到内存中。
**直接引用:**通过对符号引用进行解析,找到引用的实际内存地址。直接引用是和虚拟机实现的内存布局相关的。如果有了直接引用,那引用的目标必定已经在内存中存在。

5.初始化阶段
在准备阶段,类变量已经被赋过默认初始值,而在初始化阶段,类变量将被赋值为代码期望赋的值。初始化阶段是执行类构造器方法的过程。
在这里插入图片描述
在这里插入图片描述
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中.
然后, 当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。(一层一层向下传).

双亲委派模型对于保证Java程序的稳定运作很重要,但它的实现却非常简单,实现双亲委派的代码都集中在java.lang.ClassLoader的loadClass () 方法之中.
逻辑清晰易懂:先检查是否已经被加载过,若没有加载则调用父加载器的loadClass()方法,若父加载器为空则默认使用启动类加载器作为父加载器。如果父类加载失败,抛出ClassNotFoundException异常后,再调用自己的findClass()方法进行加载。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值