类装载器
class装载验证流程
1、加载
- 装载类的第一个阶段
- 取得类的二进制流
- 转为方法区数据结构
- 在java堆中生成对应的java.lang.class对象
2、连接
-
验证
1)验证的目的:保证Class流的格式是正确的。- 文件格式的验证
— 是否以0xCAFEBABE开头
— 版本号是否合理 - 元数据验证
— 是否有父类
— 继承了final类?
— 非抽象类实现了所有的抽象方法。 - 字节码验证
— 运行检查
— 栈数据类型和操作码数据参数吻合
— 跳转指令指定到合理的位置 - 符号引用验证
— 常量池描述类是否存在
— 访问的方法或字段是否存在且有足够的权限
- 文件格式的验证
-
准备
1)分配内存,并未设置初始值(方法区中)
例如:public static int v=1;在准备阶段中,v会被设置为0.
中才会设置为1。对于static final 类型,在准备阶段就会被赋上正确的值。publi static final int v = 1; -
解析
1)符号引用替换为直接引用。
3、初始化
1)执行类构造器,static 变量赋值,static{}语句。
2)子类的调用前保证父类的被调用。
3)是线程安全的。
什么类装载器ClassLoader
1、ClassLoader是一个抽象类,ClassLoader的实例将读入Java字节码将类装载到JVM中,ClassLoader可以定制,满足不同的字节码流获取方式,
ClassLoader负责类装载过程中的加载阶段。
2、JDK中ClassLoader默认设计模式,分类
- BootStrap ClassLoader(启动ClassLoader)
- Extension ClassLoader(扩招ClassLoader)
- App ClassLoader(应用ClassLoader /系统ClassLoader
- Custome ClassLoader(自定义ClassLoader)
每一个ClassLoader都有一个Parent作为父亲。
3、JDK中ClassLoader默认设计模式 — 协同工作。
自底向上检查,自顶向下加载。
4、JDK中ClassLoader默认设计模式 --解决
Thread.setContextClassLoader()
- 上下文加载器
- 是一个角色
- 用以解决顶层ClassLoader无法访问底层ClassLoader的类的问题。
- 基本思想是,在顶层ClassLoader中,传入底层ClassLoader的实例。
热替换
含义:当一个class被替换后,系统不需要重新启动,替换的类立即生效。