Java 类加载机制是 JVM 在运行时把 .class 文件加载到内存并转换成可运行结构的过程
重点 加载过程 + 类加载器 + 双亲委派机制
类加载的过程
加载 (Loading) — 这一步jvm根据类加载器找到对应的class,将class文件读取为字节数组,并在方法区生成类的信息(类的元数据,字段信息,方法信息,常量池);并在堆中创建class对象
↓
验证 (Verification) — 这一步jvm检查class文件的正确性,比如方法签名、字段类型、继承关系等
↓
准备 (Preparation) — 为类变量分配内存并设置默认值
↓
解析 (Resolution) — 符号引用转换为直接引用,例如将引入转为内存地址
↓
初始化 (Initialization) — 从上到下初始化类,构造器,静态全局变量,静态代码块
↓
使用 (Using) — 在类被new或注入是才会使用
↓
卸载 (Unloading) — 一般而言类不会被卸载
类加载器
Bootstrap ClassLoader(启动类加载器) :主要负责加载Java核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。
Extention ClassLoader(扩展类加载器):主要负责加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。
Application ClassLoader(应用程序类加载器) :主要负责加载当前应用的classpath下的所有类
双亲委派机制
原则是:
先让父类加载
父类加载不了
再自己加载
原因是为了防止核心的类被篡改,例如原生的String类,如果有人想定义同路径同名的类,如果没有双亲委派:程序可能加载恶意String
双亲委派机制的好处是:避免重复类的创建,用到的时候再去加载,同一个类只被加载一次