本文主要对Java类加载的时机、类加载的过程和几种常见的类加载器进行了总结。

JVM类加载机制

1. 类加载的时机

  • 创建类实例的时候,读取或者设置一个类的静态字段(被final修饰,已在编译期把结果放入常量池的除外),以及调用一个类的静态方法的时候。
  • 对类进行反射调用的时候,如果没有进行过初始化则需要先出发其初始化过程。
  • 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先出发其父类的初始化过程。
  • 当虚拟机启动时,定义了入口(含有main()方法的那个类)的主类,虚拟机会先初始化这个主类。
  • 当使用JDK1.7及以上的版本中的动态语言支持时,若一个java.lang.invoke.MethodHandle实例最后的解析结果是:REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先出发它的初始化过程。

2. 类加载的过程

2.1. 加载
2.2. 验证
2.2.1. 文件格式验证
保证输入的字节流能正常解析
2.2.2. 元数据验证
对元数据进行与语义校验
2.2.3. 字节码验证
对数据流和控制流进行分析
2.2.4. 符号引用验证
目标:确保解析动作正常执行
对类自身以外的信息进行校验
2.2.5. -Xverify:none 参数关闭大部分验证措施
2.3. 准备
2.4. 解析
2.4.1. 符号引用转化为直接引用
2.5. 初始化

3. 类加载器

3.1. 双亲委派模型
3.1.1. 类加载器
启动类加载器 BootStrap ClassLoader
扩展类加载器 Extend ClassLoader
应用程序类加载器 App ClassLoader
3.1.2. 工作过程
让父类先加载,父类加载失败才自己加载
3.1.3. 目的
安全性
避免重复加载
3.2. 破坏双亲委派模型
3.2.1. 不遵循父类先加载的原则
3.2.2. 举例
DriverManager
https://blog.csdn.net/u012129558/article/details/81540804
3.3. 自定义加载器

Contents
  1. 1. 1. 类加载的时机
  2. 2. 2. 类加载的过程
  3. 3. 3. 类加载器