java ClassLoader笔记(一)

本文详细解析了Sun JDK中的ClassLoader体系结构,包括Bootstrap、Extension及System ClassLoader之间的层次关系及特殊点,阐述了上级委托机制的优势及作用原理,并通过源码分析了类加载的过程。

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

作者:fbysss
msn:jameslastchina@hotmail.com 
blog:blog.youkuaiyun.com/fbysss
声明:本文由fbysss原创,转载请注明出处
关键字:ClassLoader

一、Sun JDK Classloader体系

1.层次关系

Bootstrap: 加载rt.jar

<-Extension:加载 jre/ext/*.jar 

<-System:加载CLASSPATH中的jar

<-UserDefined加载用户自定义包类

2.特殊点

   Bootstrap ClassLoader为C++所写,Extension ClassLoader的parent为null,其中,getParent返回实例化本ClassLoader的ClassLoader,并不是superClass。

3.上级委托

很反感“双亲委托”这个翻译。给人第一印象要两个类去委托,而且,很容易感觉是继承关系。上级委托多好,立马减轻了理解难度。

上级委托的优点:

a.避免父子重复加载

b.避免jdk核心类被替代。比如String.class,在rt.jar包中。如果用户自己写了一个恶意代码,

由此想象一下我们经常遇到的,不同版本的jar包,出现冲突的原因(未经测试):

testv1.jar

testv2.jar

a.如果两个包是独立的,不被其他包中的class引用:

   如果两个包中的文件个数和名称完全一致,不会有冲突。因为同样的版本只加载一次。

   如果v2中有新的类,而加载的是testv1.jar,v2的新类就可能使用到v1的其他旧类,导致方法找不到或者逻辑错乱。

   如果加载的是testv2.jar,而v2是向下兼容,只增加类和方法,没有冲突。因为v1的类都不加载

   如果加载的是testv2.jar,只是删除了旧版本一些相对独立的类,这样旧版本中的这些类会被加载,并可以正常使用。

b.如果test包还有其他类引用,那就不好说了。类似上述情况,可能会出现冲突。

  

二、源码理解

从这里也可以了解,ClassNotFoundException是因为什么情况产生了。就是当前类的类加载器没有找到对应jar或class文件。

Class.forname(String clazzName)实际上是使用了一个默认的类加载器,

从这里可以看出,使用的是调用Class.forname这个类所被加载的类加载器,对于一般的应用,就是SystemClassLoader,sun.misc.Launcher$AppClassLoader是一个实现

 


工具代码:用于查看Extension ClassLoader所加载的包

其他:

JVM中,一个类是否装载,由其fully qualified class name,也就是加包名的完整类名如com.sss.test.Test,及其装载器唯一决定。

也就是说,即使是同一个类,如果装载器不同,就可能被装载多次。

后记:

本想就写一篇笔记,但ClassLoader涉及的内容很多,还是一点一点来吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值