java类加载机制

Java类加载机制是Java虚拟机(JVM)在运行Java应用程序时,负责查找和加载类文件(.class)的重要组成部分。这个机制确保了类型的安全性和系统的动态扩展性。以下是Java类加载机制的主要要点:

类加载过程:

        加载(Loading)由类加载器(ClassLoader)负责找到类的二进制数据(字节码),读取.class文件并将之转换为方法区内的运行时数据结构,同时在堆上创建一个代表此类型的Class对象。

验证(Verification)确保被加载类的字节码符合Java虚拟机规范,不包含安全方面的问题,如非法数据类型、操作数栈溢出等。

准备(Preparation)为类的静态变量分配内存,并赋予默认初始值(零值或null),但尚未初始化这些变量。

解析(Resolution)将常量池中的符号引用替换为直接引用,例如将字符串、类、接口、字段和方法的引用解析到具体的内存地址。

初始化(Initialization):若类还未初始化,则触发类的初始化过程,即执行类构造器<clinit>方法,初始化类变量(静态变量)和执行静态初始化块的代码。

类加载器:

Java中有多种类加载器,它们之间遵循“双亲委派模型”。当一个类加载器收到加载类的请求时,它首先委托给其父类加载器尝试加载,直至顶层的启动类加载器(Bootstrap ClassLoader)。只有父加载器无法找到相应类时,子加载器才会尝试加载。
类加载时机:

当首次主动使用类(如创建类实例、调用类的静态方法、访问类的静态字段等)时,会触发类的加载和初始化。
生命周期:

类加载过程完成后,类进入生命周期的使用阶段。在使用过程中,类可能会被卸载(Unloading),但这在一般应用中并不常见,尤其在HotSpot JVM中,类卸载条件非常苛刻。
自定义类加载器

开发者可以通过继承Java的ClassLoader类来创建自定义类加载器,从而实现按需加载、加密解密加载、网络加载等非标准加载行为。
类加载器与类的唯一性:

        同一个类的不同加载器加载后,会在JVM中视为不同的类型,这是实现诸如Tomcat容器中多Web应用隔离的关键机制之一。

在现实生活中,我们可以把Java类加载机制类比为图书借阅系统:

类加载器(ClassLoader):相当于图书管理员。当读者需要一本书(类)时,图书管理员首先会去查询书库(父类加载器),如果父级书库没有这本书,管理员才会去新书库或者特定分类书架(自定义类加载器)寻找并获取这本书。

加载(Loading)图书管理员找到书籍的具体实体,将其从书架上拿下来,对应于类加载器找到类的字节码文件并读入到内存中。

验证(Verification)图书管理员会检查这本书是否完整无缺、内容合法,就像类加载器要确保类的字节码符合Java规范,不存在安全问题。

准备(Preparation)书籍被放在指定位置并登记基本信息,但具体内容还没有完全展示,就如同类的静态变量被分配内存空间并设置初始值。

解析(Resolution:书中提到的其他书籍或参考资料,图书管理员将其关联到对应的实体书籍,类似于类加载器解析类中引用的其他类、接口等资源。

初始化(Initialization):读者开始阅读并翻看书籍的前言和目录部分(类初始化时执行静态代码块和初始化静态变量),之后才正式进入内容阅读阶段。

类加载时机只有当读者真正需要阅读某本书时,图书管理员才会进行上述的一系列操作;对应于在Java程序运行过程中,只有在首次主动使用某个类时,才会触发该类的加载和初始化

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值