类加载器

本文介绍Java中的类加载器,包括启动、扩展和系统类加载器的工作原理及双亲委派机制。并探讨了如何自定义类加载器。

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

类加载器

前提:通过一个类的全限定名来获取描述此类的二进制字节流,实现这个动作的代码模块称为类加载器。这里并没有规定读取方式,可以从Class文件、网络、数据库、内存等。比较两个类是否相等,需要两个类来源于同一个Class文件,被同一个类加载器加载。

Java有两种类加载器。Java虚拟机用c++语言实现的启动类加载器(Bootstrap ClassLoader)。Java语言的其它类加载器如:扩展类加载器(Extension ClassLoader)和系统(应用)类加载器(Application ClassLoader)

启动(Bootstrap)类加载器:<Java_Home>/lib或-Xbootclasspath选项指定的路径下能被虚拟机识别的类库(不是任意的)加载到虚拟机内存中。

扩展(Extension)类加载器:负责将< Java_Home >/lib/ext或者由系统变量-Djava.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。

系统(System)类加载器:负责将系统类路径java -classpath或-Djava.class.path变量所指的目录下的类库加载到内存中。开发者可以直接使用系统类加载器。默认的类加载器。

类加载双亲委派机制:Java设计者推荐开发者采用双亲委派机制实现类加载器。也是我们使用JDK的虚拟机的类加载方式。加载一个类首先会递归交给父类加载,如果加载不成功则由自己加载。


图三 类加载器默认委派关系图

 

我们首先看一下java.lang.ClassLoader抽象类中重要的两个方法:

MyClassLoader.java

自定义类加载器,需要传入要加载的目录

实现方式(这个方法会被调用两次,一次主动一次被动)(为什么?)

测试方法

上面重写loadClass方法是不推荐的,推荐重写findClass方法。loadClass仍交给父类。

只需要把loadClass方法替换为findClass方法。其它不变。测试结果不一致。两种类加载器加载后的Class类型是不一样的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值