类加载器

类加载器:通过一个类的全限定名来获取描述此类的二进制字节流。

类的唯一性:对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。也就是说比较两个雷是否相等,只有在这两个类时同一类加载器加载的前提下才有意义。如果同一个class被同一虚拟机加载,只要加载它们的类加载器不同,那么这两个类就必定不相等。

java虚拟机角度:两种不同的类加载器,一种是启动类加载器,由C++实现,是虚拟机的一部分。另一种是由java实现的,独立于虚拟机外部,并且都继承自抽象类java.lang.ClassLoader。

开发人员角度:分为三种
启动类加载器(Bootstrap ClassLoader):用于引导启动java虚拟机。当调用javax.exe程序时,就会启动引导类加载器。加载运行JVM所需要的类,以及所有的java核心类。例如java.lang包和java.io包下的类。
扩展类加载器(Extension ClassLoader): 负责加载标准扩展目录中的类。
应用程序类加载器(Application ClassLoader): 是默认的的类加载器。是getSystemClassLoader()方法的返回值。负责加载用户目录classpath上指定的类库。也叫作系统类加载器

JVM如何选择类加载器:使用双亲委派模型。每当需要加载一个类的时候,会首先调用系统类加载器。但是,它并不会立即加载某个类。它会先加载类的任务委派给父类加载器。所以,Bootstrap ClassLoader总会先执行加载某个类的任务。如果Bootstrap ClassLoader找不到需要加载的类,那么扩展类加载器会尝试加载该类。如果扩展类加载器也找不到加载这个类,就会轮到系统类加载器继续执行加载任务。如果系统类加载器还是找不到这个类,就会抛出java.lang.ClassNotFoundException异常。
通过双亲委派模式可以保证一个类只会被加载一次。比如java.lang.Object,它存放在rt.jar中,无论哪一个类加载器要加载这个类,最终都会委派给处于模型最顶端的启动类加载器进行加载,所以Object类在程序中的各种类都是同一个类。如果没有使用双亲委派模型,object类在程序中各个类加载器去执行的话,或者用户自己定义了一个java.lang.Object,那么系统将会出现多个Object类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值