在右侧的三个小标签里,列举了此层类加载器主要加载的代表性类库,事实上不止于此
通过如下代码可以查看Bootstrap 所有已加载类库
执行结果
Bootstrap加载的路径可以追加,不建议修改或删除原有加载路径
在JVM中增加如下启动参数,则能通过正常读取到指定类,说明此参数可以增加Bootstrap的类加载路径:
如果想在启动时观察加载了哪个jar包中的哪个类,可以增加
此参数在解决类冲突时非常实用,毕竟不同的JVM环境对于加载类的顺序并非是一致的
有时想观察特定类的加载上下文,由于加载的类数量众多,调试时很难捕捉到指定类的加载过程,这时可以使用条件断点功能
比如,想查看HashMap的加载过程,在loadClass处打个断点,并且在condition框内输入如图
JVM如何确立每个类在JVM的唯一性
类的全限定名和加载这个类的类加载器的ID
在学习了类加载器的实现机制后,知道双亲委派模型并非强制模型,用户可以自定义类加载器,在什么情况下需要自定义类加载器呢?
隔离加载类
在某些框架内进行中间件与应用的模块隔离,把类加载到不同的环境
比如,阿里内某容器框架通过自定义类加载器确保应用中依赖的jar包不会影响到中间件运行时使用的jar包
修改类加载方式
类的加载模型并非强制,除Bootstrap外,其他的加载并非一定要引入,或者根据实际情况在某个时间点进行按需进行动态加载
扩展加载源
比如从数据库、网络,甚至是电视机机顶盒进行加载
防止源码泄露
Java代码容易被编译和篡改,可以进行编译加密 。那么类加载器也需要自定义,还原加密的字节码 。
实现自定义类加载器的步骤
继承ClassLoader
重写findClass()方法
调用defineClass()方法
一个简单的类加载器实现的示例代码如下

文章插图
由于中间件一般都有自己的依赖jar包,在同一个工程内引用多个框架时,往往被迫进行类的仲裁 。按某种规则jar包的版本被统一指定, 导致某些类存在包路径、类名相同的情况,就会引起类冲突,导致应用程序出现异常 。
主流的容器类框架都会自定义类加载器,实现不同中间件之间的类隔离,有效避免了类冲突 。
推荐阅读
- 采摘君山银针的时间,君山银针茶的价格
- 两宋时期订立澶渊之盟的双方是?请简要评价北宋和辽之间的澶渊之盟
- mc我的世界怎么骑马?我的世界马骑不上去
- 下半年万千贵人来相助, 整体运势亨通不断的生肖-年年如意进旺财,岁岁平安走好运-
- HTML5最新版本介绍
- 中秋佳节打一个动物?端午节的动物打一个生肖_3
- 三个和尚挑水的故事管理启示?三个和尚去挑水的故事
- 熟普洱茶去火,一起来看熟普洱茶图片
- 丁汝昌殉国是什么战役 丁汝昌是哪个战役牺牲的
- 诸葛亮是刘备的谋士吗 刘备见诸葛亮之前遇到什么人
