Java类加载全流程解析
回答
1、类加载的触发场景
- 创建类实例:通过
new关键字创建类对象时,若类未加载,JVM 调用类加载器加载。 - 使用静态成员:调用类的静态方法或访问(未加载时)静态变量,触发类加载。
- 反射访问:通过反射(如
Class.forName())访问类,类未加载则启动加载流程。 - JVM 启动:自动加载基础类,如
java.lang.Object、java.lang.Class等。
2、类加载的特性
- 除基础类外,Java 类加载是延迟加载,按需加载;
- 支持动态加载类,提升程序灵活性。
3、类加载的步骤
-
loadClass 加载逻辑
-
先检查类是否已经被加载过。
-
若没有加载过,则调用父加载器的loadClass()方法,
-
若父加载器为空,则默认使用启动类加载器(bootstrap)作为父加载器。
-
如果父类加载失败,抛出ClassNotFoundException异常后,
-
最后,调用自己的findClass()方法进行加载。
-
-
缓存思想,如果该类已经被加载过,则不加载
-
使用双亲委派模型,对该类进行加载
-
如果,通过 CLASSPATH 找不到该类的定义,则会通过 findClass 让子类自定义的去获取类定义的二进制文件
-
然后,通过 defineClass 将二进制文件加载为类