类装载器ClassLoader

本文详细阐述了Java类装载器的工作机制,包括类装载的三个阶段:装载、链接和初始化,以及类装载器的层级结构和全盘负责委托机制。

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

[size=large]类装载器工作机制[/size]
类装载器就是寻找类的节码文件并构造出类在JVM 内部表示对象的组件。在Java 中,
类装载器把一个类装入JVM 中,要经过以下步骤:
1.装载:查找和导入Class 文件;
通过一个类的全限定名来获取定义此类的二进制字节流.然后将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构.最后在Java堆中生成一个代表这个类的java.lang.class对像,作为方法区的数据入口.

2.链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的:
a)校验:检查载入Class 文件数据的正确性;
b)准备:给类的静态变量分配存储空间;
c)解析:将符号引用转成直接引用;

3.初始化:对类的静态变量、静态代码块执行初始化工作。

类装载工作由ClassLoader 及其子类负责,ClassLoader 是一个重要的Java 运行时系统组件,它负责在运行时查找和装入Class 字节码文件。JVM 在运行时会产生三个
ClassLoader:
BootstrapClassLoader
Extension ClassLoader(扩展类装载器)
Application ClassLoader(系统类装载器)。

其中,BootstrapClassLoader不是ClassLoader 的子类,它使用C++编写,因此我们在Java 中看不到它,BootstrapClassLoader负责装载JRE 的核心类库,如JRE 目标下的rt.jar、charsets.jar 等。

Extension ClassLoader 和Application ClassLoader 都是ClassLoader 的子类。其中Extension ClassLoader 负责装载 JRE 扩展目录ext 中的JAR 类包;Application 负责装载Classpath 路径下的类包。


public class ClassLoaderTest {
public static void main(String[] args) {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
System.out.println("current loader:"+loader);
System.out.println("parent loader:"+loader.getParent());
System.out.println("grandparent loader:"+loader.getParent(). getParent());
}
}



current loader:sun.misc.Launcher$AppClassLoader@131f71a
parent loader:sun.misc.Launcher$ExtClassLoader@15601ea
//①根装载器在Java中访问不到,所以返回null
grandparent loader:null


通过以上的输出信息,我们知道当前的ClassLoader 是AppClassLoader,父ClassLoader是ExtClassLoader,祖父ClassLoader 是根类装载器,因为在Java 中无法获得它的句柄,所以仅返回null。


JVM 装载类时使用“全盘负责委托机制”,“全盘负责”是指当一个ClassLoader 装载一个类的时,除非显式地使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader 载入;“委托机制”是指先委托父装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这一点是从安全角度考虑的,试想如果有人编写了一个恶意的基础(如java.lang.String)并装载到JVM 中将会引起多么可怕的后果。但是由于有了“全盘负责委托机制”,java.lang.String 永远是由根装载器来装载的,这样就避免了上述事件的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值