类加载

类加载

一、关于类加载器
1).系统默认自带3个类加载器BootStrap、Extension、System(Application)。三个类加载器之间为父子关系。
2)BootStrap为启动类加载器(由C/C++实现),加载jvm核心库(java.lang.*),是Extension加载器的父加载器。
3)Extension为扩展类加载器(由纯java实现),是System的父类加载器。
4)App为应用加载器(由纯java实现),加载路径为环境变量中classpath中所包含的路径,是自定义加载器的默认父加载器。
二、类加载过程
在这里插入图片描述

1)加/装载阶段在这里插入图片描述
在这里插入图片描述
流程描述:自下到上是从子类到父类依次寻找是否加载过类,若加载过,将加载产物class对象返回,若没有加载过,则依次在其中查找直到Boostrap。自上到下是从父类到子类依次尝试加载,将加载产物class对象返回,若路径找不到则加载失败—>ClassNoFoundException异常。
加载类遵循双亲委派模型
双亲委派模型的优点
(1).安全性
(2).避免类的重复加载(加载时机:在类的初始化时进行加载,如在:new People ;People.class; 类名.静态变量/静态方法.时进行)
注意
People p1=new people;
People p2=new people;
这一过程中只进行一次类加载。
2)链接阶段
验证:文件格式验证,主次版本号,验证文件魔数(字节码文件".class"由魔数4字节;主+次版本号4字节;Contant tool构成)符不符合当前虚拟机的处理范围。
准备:准备阶段是正式为类变量分配内存并设置初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。(count在方法区中分配4字节并赋类型为默认值)
解析:将符号引用改为直接引用的过程,将逻辑地址改为实际地址。
3)初始化阶段:给静态变量赋值的操作。
三、自定义类加载器
1)根据路径找到相对应的字节码文件findClass 方法。
2)采用双亲委派模型加载loadClass方法。
3)加载字节码文件生成对应的class对象defineClass方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值