类加载的过程大概分7个步骤分别是:加载 — 验证 — 准备 — 解析 — 初始化 — 使用 —卸载。这里面也有一个加载,但是需要注意的是,类加载和加载是完全不同的两个概念,加载只是类加载中的一个步骤,其中(验证,准备,解析)统称为连接,接下来为大家一一介绍这几个步骤的意义
- 加载:
1, 虚拟机加载的时候主要做三件事情:
(1)通过一个类的全限定名来获取定义此类的二进制字节流
(2)将这个字节流所代表的静态存储结构转换为方法区运行时数据结构
(3)在这个方法区中生成代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
2,数组类本身不是类加载器加载的,是java虚拟机自动创建的
- 验证
验证是链接的第一个阶段,主要作用就是确保class文件字节流包含的信息符合虚拟机的要求,不会危害虚拟机的安全
- 准备
正式为类变量(不包括实例变量)在方法区分配内存,并且给类变量设置初始值(0值,并不是真正的代码中的设置的值,初始化阶段才会设置真正的值),这也是为什么在写代码的时候类变量不需要设置初始值,而局部变量只有设置初始值的前提下才可以使用。
- 解析
将常量池中的符号引用替换为直接引用的过程
- 初始化
初始化阶段是执行类构造器方法的过程
接下来为大家介绍类加载器相关知识
(1)类与类加载器
判断两个类是否相等,只有在两个类是由同一个类加载器生成的同一个对象加载的前提下才有意义,即使是同一个类加载器生成的不同对象加载的类也会相等
(2)双亲委派模型
- java虚拟机中的类加载器主要分为三类
(1)启动类加载器,主要负责<JAVA_HOME>\lib目录下面
(2)扩展类加载器,主要负责<java_home>\lib\ext
(3)应用程序类加载器:负责加载应用程序类路径上所指定的类库
- 双亲委派模型工作过程
如多一个类加载器收到加载请求首先会把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,只有当父加载器反馈自己无法完成这个请求的时候,子加载器才会自己去加载
- 类加载器使用双亲委派模型的好处
(1)java类随着他的类加载器一起具备了一种带有优先级的层次关系
(2)防止相同的类被加载,似的基础类不能被保证安全
(3)防止出现相同的类对象
- 3次双亲委派模型的破坏
(1)jdk1.2之前,没有这个模型
(2)模型自身的缺陷,需要父类加载器委派子类去加载,例如jndi,jdbc等
(3)用户对程序动态性的最求,例如热部署,代码热替换等,最典型的技术就是osgi