jvm----类与类加载器

本文介绍Java虚拟机中的类加载器工作原理,包括启动类加载器、扩展类加载器及应用程序类加载器的作用与区别,详细解析了类加载器的双亲委派模型及其优势,并探讨了该模型可能被破坏的情况。

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

类与类加载器:每一个类加载器,都拥有一个独立的类名称空间。比较两个类是否“相等”,只有在这两个类是由同一个类加载器加载的前提下才有意义。

从java虚拟机角度划分类加载器:1.启动类加载器,是虚拟机自身的一部分

                                             2.所有其他的类加载器,独立于虚拟机外部,并且全都继承自抽象类java.lang.ClassLoader

进一步细致划分:1.启动类加载器/引导类载入器(将虚拟机启动需要的类库加载到虚拟机内存中。启动类加载器无法被java程序直接引用)

                        2.扩展类加载器(加载lib目录下的类库,开发者可直接使用扩展类加载器)

                        3.应用程序类加载器/系统类载入器(程序默认的类加载器,开发者可直接使用)

-----------------------------------------------------------------------------------


类加载器之间的这种层次关系称为类加载器的双亲委派模型。

双亲委派模型要求除了顶层的启动类加载器之外,其余的类加载器都应当有自己的父类加载器。这里的父子关系一般不会以继承的关系实现,而是以组合关系来复用父加载器代码。

双亲委派模型的工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器无法加载时,子加载器才会尝试自己去加载。

优点:java类随着它的类加载器一起具备类一种带有优先级的层次关系。例如java.lang.Object,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此object类在程序各种类加载器环境中都是同一个类。双亲委派模型对于保证java程序的稳定运作很重要,很好的解决了各个类加载器的基础类的统一问题。

-----------------------------------------------------------------------------------

破坏双亲委派模型

例1:线程上下文类加载器。父类加载器请求子类加载器去完成类加载的动作,逆向使用类加载器。比如java中jndi、jdbc、代码热替换、模块热部署等


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值