本文共 1087 字,大约阅读时间需要 3 分钟。
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被替换后,系统不需要重新启动,替换的类立即生效。
转载地址:http://anfoi.baihongyu.com/