关于java类加载器的学习笔记

前言

本篇博客是我自己看了这篇博客后,根据自己的需求,将一些关键知识简单的提取了出来,加以记录,以方便以后复习。想要深究的读者,我强烈建议仔细看一下上文提到的博客。当然还是先谢谢这位前辈辛苦分享的博客,帮我对类加载器有了一个更深的学习。

什么是类加载器

我们在编辑器里写的.java文件仅仅只是一个有一定格式规范的文本文档而已,真正执行的程序是后缀为.class的文件。在一个程序中,将我们需要的这些.class文件放进jvm的,就是类加载器。

类加载器的功能

单独提出来,强调一下。类加载器的功能就是动态加载class文件到内存当中用的。为什么要动态?很好理解,我们需要什么工具(类)的时候,就加载什么工具(类)到内存运行,其它的暂时用不到的.class文件就等它安安静静的躺在工具箱(磁盘)里。要一来就把硬盘里的所有的类全部加载,内存肯定崩掉。

类加载器的分类

按照加载顺序,总共有三种加载器,分别是:
Bootstrap ClassLoader
Extention ClassLoader
Application ClassLoader
其实严格来讲,还有一个自定义类加载器,不过本文主要讲的是自带的,因此不多提及,想要了解的同学查看我开头说的那篇博客
当运行一个程序的时候,JVM启动,运行Bootstrap ClassLoader,该ClassLoader加载java核心API(Extention ClassLoader和Application ClassLoader也在此时被加载),然后调用Extention ClassLoader加载扩展API,最后Application ClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。

Bootstrap ClassLoader

Bootstrap ClassLoader是由C/C++编写的,它本身是虚拟机的一部分,所以它并不是一个JAVA类,也就是无法在java代码中获取它的引用,JVM启动时通过Bootstrap类加载器加载核心的类文件(即所有java.*开头的类),例如int.class,String.class都是由它加载。它的地位位于所有加载器之首,换句话说,它是所有加载器的父加载器,只有等这个加载器启动之后,其余的类加载器才能起作用。

Extention ClassLoader

Extension ClassLoader负责加载扩展的Javaclass(例如所有javax.*开头的类和存放在JRE的ext目录下的类),同时,它也是Application ClassLoader的父加载器。

Application ClassLoader

Application ClassLoader加载的主要是当前应用的java.class.path下的类,举例来说,我们自己写的类基本都是由这个加载器来加载的。这个加载器也被默认当做类加载器。

类加载器的运行模式

类加载器的运行模式遵循的是“双亲委托”模式。
一个类加载器查找class和resource时,是通过“委托模式”进行的,它首先判断这个class是不是已经加载成功,如果没有的话它并不是自己进行查找,而是先通过父加载器,然后递归下去,直到Bootstrap ClassLoader,如果Bootstrap ClassLoader找到了,直接返回,如果没有找到,则一级一级返回,最后到达自身去查找这些对象。这种机制就叫做双亲委托。
通过双亲委托我们也可以理解为什么类加载器的运行顺序是Bootstrap ClassLoader->Extension ClassLoader->Application ClassLoader
用序列描述一下:
1. 一个AppClassLoader查找资源时,先看看缓存是否有,缓存有从缓存中获取,否则委托给父加载器。
2. 递归,重复第1部的操作。
3. 如果ExtClassLoader也没有加载过,则由Bootstrap ClassLoader出面,它首先查找缓存,如果没有找到的话,就去找自己的规定的路径下,也就是sun.mic.boot.class下面的路径。找到就返回,没有找到,让子加载器自己去找。
4. Bootstrap ClassLoader如果没有查找成功,则ExtClassLoader自己在java.ext.dirs路径中去查找,查找成功就返回,查找不成功,再向下让子加载器找。
5. ExtClassLoader查找不成功,AppClassLoader就自己查找,在java.class.path路径下查找。找到就返回。如果没有找到就让子类找,如果没有子类会怎么样?抛出各种异常。

待补充。。。。。。

参考资料

https://blog.csdn.net/briblue/article/details/54973413#t29

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值