Java类加载全流程解析

41 阅读1分钟

Java类加载全流程解析

回答

1、类加载的触发场景
  1. 创建类实例:通过 new 关键字创建类对象时,若类未加载,JVM 调用类加载器加载。
  2. 使用静态成员:调用类的静态方法或访问(未加载时)静态变量,触发类加载。
  3. 反射访问:通过反射(如 Class.forName())访问类,类未加载则启动加载流程。
  4. JVM 启动:自动加载基础类,如 java.lang.Objectjava.lang.Class 等。
2、类加载的特性
  1. 除基础类外,Java 类加载是延迟加载,按需加载
  2. 支持动态加载类,提升程序灵活性。
3、类加载的步骤

image-20250314221029029

image-20250314221041599

  1. loadClass 加载逻辑

    1. 先检查类是否已经被加载过。

    2. 若没有加载过,则调用父加载器的loadClass()方法,

    3. 若父加载器为空,则默认使用启动类加载器(bootstrap)作为父加载器。

    4. 如果父类加载失败,抛出ClassNotFoundException异常后,

    5. 最后,调用自己的findClass()方法进行加载。

  2. 缓存思想,如果该类已经被加载过,则不加载

  3. 使用双亲委派模型,对该类进行加载

  4. 如果,通过 CLASSPATH 找不到该类的定义,则会通过 findClass 让子类自定义的去获取类定义的二进制文件

  5. 然后,通过 defineClass 将二进制文件加载为类