class加载到运行时数据区前的加载过程

本文详细解析了类加载的全过程,从字节流获取到初始化,涉及Bootstrap、Extension和AppClassLoader,重点讲解了双亲委派原理及其在防止类重复加载和增强安全性中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


class加载到运行时数据区前的加载过程:

  1. 通过一个类的全限定名来获取定义的class二进制字节流。
  2. 通过类加载器,加载此文件。从下往上依次为User Defined Class Loader、Application Class Loader、Extension Class Loader、BootStrap Class Loader(自定义类加载器 -> 应用类加载器 -> 扩展类加载器 -> 扩展类加载器 -> 引导类加载器)
  3. 连接-验证(文件格式校验)
  4. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  5. 连接-验证 (元数据验证、字节码验证)
  6. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
  7. 链接-准备,会为类变量初始化默认变量值,但并不会分配初始化实例对象(final static不包括在内)
  8. 链接-解析,将常量池中的符号引用转换为直接引用、就是HelloWorld.class反编译中反编译代码Constant pool中的信息。
  9. 链接-验证 (符号引用验证)
  10. 初始化,始化阶段就是执行类构造器()方法的过程

类加载器:
启动类加载器( 引导类加载器,Bootstrap ClassLoader )

  • 加载Java的核心库(JAVA_HOME / jre / lib / rt.jar、resources.jar 或 sun.boot.class.path 路径下的内容)
  • 为了安全,Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类

扩展类加载器(Extension ClassLoader)

  • JDK安装目录 jre / lib / ext子目录(扩展目录)下加载类库

应用程序类加载器(系统类加载器,AppClassLoader)

  • 该类加载是程序中默认的类加载器,一般来说,Java应用的类都是由它来完成加载的

双亲委派:
按需将class文件加载到内存够中,子类加载器会将子类请求委托给父类加载,如果父类加载器可以完成类加载任务,就成功返回,并且子类不再进行加载。如果父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,若果子类也无法加载,抛出ClassNotFoundException异常。

  • 意义:防止类重复加载,加重安全防护,防止核心API修改
  • 注: 当编译器成功后,运行期找不到此类(可能被删除、也可能被篡改)则抛出NoClassDefFoundError异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值