类装载器
是什么
我们敲的代码即.java文件经过编译之后得到.class文件,然后这个文件通过JVM的虚拟机加载的到内存中,并形成一个class对象,这个称之为类的加载过程,负责将.class字节码文件加载到内存的工具称之为类加载器。
下面来说说类加载的过程
过程
加载
- 装载类的第一个阶段
- 取得类的二进制流
- 转为方法区数据结构
- 在java堆中生成对应的java.lang.Class对象
链接
验证
- 目的:保证class流的格式是正确的
- 文件格式的验证
- 是否以0xCAFEBABE开头
- 版本号是否合理
- 元格式的验证
- 是否有父类
- 基础了final类
- 非抽象类实现了所有的抽象方法
- 字节码验证
- 运行检查
- 栈数据类型和操作码数据参数吻合
- 跳转指定指令到合理的位置
- 符合引用验证
- 常量池中描述类是否存在
- 访问的方法或字段是否存在且有足够的权限
- 文件格式的验证
准备
- 分配内存,并为类设置初始值(方法区中)
解析
- 符号引用替换为直接引用,class具体运行过程中,才能索引到它要引用的内容
初始化
- 执行类构造器
- static变量 赋值语句
- static{}语句
- 子类的调用前保证父类的被调用
- 是线程安全的
什么是类装载器ClassLoader
- ClassLoader是一个抽象类
- ClassLoader的实例将读入java字节码将类装载到jvm中
- ClassLoader可以定制,满足不同的字节码流获取方式
- ClassLoader负责类装载过程中的加载阶段