【java 类加载和类加载器】

概要

在Java中,类加载(Class Loading)是Java运行时环境(JRE)的一部分,负责在运行时动态地加载Java类到Java虚拟机(JVM)中。这个过程由类加载器(ClassLoader)完成。

类加载

类加载主要完成以下三个步骤:

  • 加载(Loading):通过类的全名获取定义此类的二进制字节流,将其所代表的静态存储结构转化为方法区的运行时数据结构,并在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。
  • 链接(Linking):
    • 验证(Verification):确保被加载的类的正确性和安全性。
    • 准备(Preparation):为类的静态变量分配内存,并将其初始化为默认值。
    • 解析(Resolution):把类中的符号引用转换为直接引用。
  • 初始化(Initialization):为类的静态变量赋予正确的初始值。

类加载器(ClassLoader)

类加载器负责加载Java类到JVM中。Java提供了三种类加载器:

  • 引导类加载器(Bootstrap ClassLoader):这是JVM的自身类加载器,主要加载核心类库,如rt.jar、resources.jar、charsets.jar等。该类加载器使用C++实现,是JVM自身的一部分。
  • 扩展类加载器(Extension ClassLoader):由Java实现,负责加载Java的扩展类库,默认加载JAVA_HOME/lib/ext目录下的所有jar包。
  • 系统类加载器(System ClassLoader):也叫应用类加载器(Application ClassLoader),由Java实现,负责加载应用程序classpath目录下的所有类文件。

除了这三种类加载器,Java还支持自定义类加载器,通过继承java.lang.ClassLoader类来实现。

双亲委派模型(Parent Delegation Model)

Java的类加载器采用双亲委派模型来组织关系。当一个类加载器需要加载某个类时,它首先会把这个请求委派给父类加载器去完成,每一层的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的引导类加载器中,只有当父加载器无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

双亲委派模型保证了Java核心API的稳定性和安全性,因为任何自定义的类加载器,最终都无法加载到核心API定义的类,从而避免了核心API被篡改的风险。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值