Java:class8 类加载,链接,初始化三大阶段

本文详细介绍了Java类的加载过程。首先是加载阶段,字节码文件被类加载器从磁盘加载到内存,介绍了系统提供的三种类加载器及双亲委派模型。使用双亲委派模型可保证安全性和避免类的重复加载。接着是链接阶段,包括验证、准备和解析。最后是初始化阶段,进行类变量赋值操作。

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

一、加载
1.java文件被编译成class字节码文件,字节码文件被类加载器从磁盘加载到内存上。

2.魔数标志着文件的类型

3.系统提供的类加载器:

①Boostrap ClassLoader:启动类加载器,主要加载jre/lib/re.jar,该目录下的所有jar包都是运行JVM时所必需的jar包。p.s.类加载器其实自身也是一个JAVA类,因此,自身类加载器需要被其他类加载器进行加载后方可使用,显然必需有一个类加载器的顶级父类(也就是BootstrapClassLoader,该类加载器是由C开发的。)是其他类加载器的父类。所以,如果一个类的类加载器是BootstrapClassLoader,那么该类的getClassLoader()方法返回null.

②Extension ClassLoader (Ext ClassLoader):扩展类加载器,主要加载JAVA核心扩展类,即jre/lib/ext目录下的jar文件。

③ApplicationClassLoader (AppClassLoader):应用类加载器,主要加载的是开发者在应用程序中编写的类,即CLASSPATH路径下的所有jar文件。

4.双亲委派模型的工作过程如下:
(1)当前类加载器从自己已经加载的类中查询是否此类已经加载,如果已经加载则返回原来已经加载的类。
(2)如果没有找到,就去委托父类加载器去加载。父类加载器也会采用同样的策略,查看自己已经加载过的类中是否包含这个类,有就返回,没有就委托其父类去加载,直到委托到启动类加载器为止。因为如果父类加载器为空了,就代表使用启动类加载器作为父加载器去加载该类。(也就是看到的 String 类加载器为 null)
(3)如果启动类加载器加载失败,就会使用扩展类加载器来尝试加载,继续失败则会使用 AppClassLoader 来加载,继续失败就会抛出一个异常 ClassNotFoundException。

5.使用双亲委派模型的好处:
(1)安全性,避免用户自己编写的类动态替换 Java 的一些核心类。如果不采用双亲委派模型的加载方式进行 类的加载工作,那我们就可以随时使用自定义的类来动态替代 Java 核心 API 中定义的类。例如:如果黑客将“病毒 代码”植入到自定义的 String 类当中,随后类加载器将自定义的 String 类加载到 JVM 上,那么此时就会对 JVM 产生 意想不到“病毒攻击”。而双亲委派的这种加载方式就可以避免这种情况,因为 String 类已经在启动时就被引导类 加载器进行了加载。
(2)避免类的重复加载,因为 JVM 判定两个类是否是同一个类,不仅仅根据类名是否相同进行判定,还需要 判断加载该类的类加载器是否是同一个类加载器,相同的 class 文件被不同的类加载器加载得到的结果就是两个不 同的类。

5.两个类是否相等,两个类的类加载器相同是前提。

二、链接阶段
(1)验证:当前字节码文件是否符合虚拟机要求(魔数,版本号……)
(2)准备:给类变量在方法区中开辟内存,赋类型的初始值
(3)解析:解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。

三、初始化
给类变量赋值操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值