类加载子系统
1.概述
1.1 是什么?
JVM构成中的一部分
1.2. 用于做什么?
负责加载类、校验类、初始化类、构建类的字节码对象。
2. 类加载器
2.1 是什么?
类加载子系统中负责将类读取到内存的对象。
2.2 有哪些类加载器?
BootStrapClassLoader
ExtClassLoader
AppClassLoader
自定义的类加载器
2.3 类加载机制-双亲委派模型?
2.3.1 原理:
向上询问、向下委派
2.3.2 特点:
优点:
可以保证一个类只能被同一个类加载器加载一次,同时保证类体系的健壮性(例如我们自己写的java.lang.Object类不能被加载)
缺点:
1)可能对效率会多少有一些影响。
2)可能对不同项目中的包名、类名相同的类无法实现正确类加载。
3. 类的加载方式
3.1 显示加载
直接调用类加载器的方法对类加载即可
3.2 隐式加载
1)访问类的成员(静态属性或方法)
2)构建类的对象(new)
4. 类加载过程
4.1 查找类
不同类加载器有不同的类加载路径
4.2 读取类
底层会通过线程调用io将磁盘或网络中的类读到内存中
4.3 连接
4.3.1校验:
校验类结构信息的合法性
4.3.2准备:
对类变量进行默认初始化
4.3.3解析:
对一些符号引用转换为直接引用。例如访问常量池中的哪个常量,调用哪个类中的哪个方法?
4.4 初始化类
1)对类变量进行初始化赋值(例如static int a=10;准备阶段是0,初始化阶段为10)
2)执行类的静态代码块。
主动使用
被动使用:被动使用是不会初始化类的。
5.1 自定义类加载器
5.1.1 为什么?
默认的类加载器不满足我们需求了
5.1.2 如何自定义?
直接或间接的继承ClassLoader类并重写相关方法