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