文章目录
- 类加载过程
- 加载(Load)
- 连接
- 初始化
- 类加载器是如何定位到具体的类文件并读取的?
- 类加载规则
- 什么时候需要自定义类加载器
类加载过程
任何程序都需要加载到内存才能与CPU进行交流.字节码.class文件统一需要加载到内存中,才能实例化类,而ClassLoader正是关键,它的使命就是提前加载.class文件到内存中. 在加载类时,使用双亲委派模型(朔源委派加载模型)
Java的类加载器是一个运行时核心基础设施模块,主要在启动之初进行类的Load Link Init,即加载 连接 初始化
类加载是一个将.class字节码文件实例化成Class对象并进行相关初始化的过程。
加载(Load)
第一步,Load阶段读取类文件产生二进制流,并转化为特定的数据结构,初步校验cafe babe 魔法数,常量池,文件长度,是否有父类等,然后创建对应类的java.lang.Class实例
连接
第二部,Link 阶段包括验证,准备,解析三个步骤。验证是更详细的校验,比如final是否合规,类型是否正确,静态变量是否合理等,准备阶段是为静态变量分配内存,并设定默认值,解析类和方法确保类之间的相互引用正确性,完成内存结构布局。
初始化
第三部,Init阶段执行类构造器方法,如果复制运算是通过其他类的静态方法完成的,那么会马上解析另一个类,在虚拟机栈中执行完毕后通过返回值进行赋值。
类加载器是如何定位到具体的类文件并读取的?
类加载器类似原始部落结构,存在权利等级制度.
- Bootstrap ClassLoader 最高一层是家族中威望最高的Bootstrap,他是JVM启动时创建的,通常有与操作系统相关的本地代码实现,是最根基的类加载器,负责装载最核心的Java类,比如Object,System,String 等,
- platfrom ClassLoader(Extension ClassLoader) 第二层从JDK9后改为platfrom ClassLoader,即平台加载器,用以加载一些扩展的系统类,不如XML,加密,压缩相关功能,JDK9之前是Extension ClassLoader,
- Application ClassLoader 第三层是Application ClassLoader的应用类加载器,主要加载用户定义的CALSSPATH路径下的类。第二,第三层类加载器为Java语言实现,用户也可以自定义类加载器。
类加载规则
低层次的当前类加载器,不能覆盖更高层类加载器已经加载的类.
如果低层次的类加载器想要加载一个未知类,需要先向上询问,该未知类是否已经加载.
高层类加载器执行两个步骤, 第一 查询自身是否已经加载过此类, 第二 如果没有,是否可以加载此类
只有当所有高层类加载器在这两个问题的回答都是否的时候,才可以有当前类加载器加载这个未知类
什么时候需要自定义类加载器
- 隔离加载类
- 修改类加载方式
- 扩展加载源
- 防止源码泄露