类加载机制
一、类加载过程
类从加载到内存到卸载出内存,它的生命周期包括:
- 加载:根据类的全限定名生成二进制字节流,将静态字节流转化为方法区的运行时数据结构,生成一个class对象
- 验证:文件验证、元数据验证、字节码验证、符合引用验证
- 准备:将类变量(static修饰)进行初始赋值,如boolean初始值为false,int初始值为0,ref初始值为null,当类变量使用fianl修饰时,会同时赋上具体的值
- 解析:将符号引用替换为直接引用
- 初始化:准备阶段已经初始化赋值过了,初始化阶段会进行类变量赋值,以及静态代码块执行
二、类加载器
- 根据类的全限定名生成二进制字节流是在虚拟机外执行,执行这个过程的模块就是类加载器
- 两个类来自于同一个class文件,但是使用不同的类加载器加载,那么他们是不相等的
三、双亲委派
- 类加载分为:
- 启动类加载器:<JAVA_HOME>/lib下的类库加载到虚拟机中
- 扩展类加载器:<JAVA_HOME>/lib/ext的类库加载到虚拟机中
- 应用类加载器:加载用户类路径上所指定的类库
- 自定义加载器:
当一个类加载器收到类加载请求,首先不会自己加载,而是委派给上级类加载器,每个层次的加载器都是这样,最后加载请求会传递到启动类加载器,当父级加载器无法加载时,子类加载器才会尝试去加载
四、双亲委派的好处
- 像一些系统类由启动类和扩展类加载,如果每个人写个类都可以用自己的加载器加载,那么系统会变的不安全,影响程序的运行
五、自定义加载器的好处
- 热更新、热部署
- 加载不同版本的jar,解决冲突
- 对类进行加解密