前言:
- 写这篇文章的背景是在看JVM面试题中,有提到 类加载机制(双亲委派机制),以及怎么打破双亲委派。结合之前有看过Tomcat源码在启动类的过程中,默认会创建几个自定义的类加载器。一直比较疑惑为什么会创建几个自定义的类加载器。
概述:
- 第一部分:JVM类加载机制以及加载流程
- 了解类加载器的分类
- 自定义类加载器代码实现
- 双亲委派机制的由来
- 双亲委派机制源码
- 为什么要打破双亲委派机制
- 第二部分:Tomcat 源码启动怎么自定义类加载器(打破双亲委派机制)
- 自定义类加载器的关系图
- 具体源码介绍
详情:
第一部分:JVM中类加载机制
1. 类加载器的分类
引导类加载器:
介绍:引导类加载器这个类使用C/C++ 语言实现的,嵌套于JVM内部,java程序无法操作这个类 。用来加载java核心类库。
例如: JAVA_HOME/jre/lib/rt.jar、resource.jar 等相关jar( 负责加载支撑JVM运行的位于JRE的lib目录下的核心类库)
扩展类加载器:
介绍:扩展类加载器这个类使用java 语言编写 ,一般位于jre/lib、ext目录下加载的类库。
应用类加载器:
介绍:负责加载ClassPath路径下的类包(理解:target包下编译以后的class 文件),主要就是加载你自己写的类
自定义类加载器:
介绍:通过继承ClassLoader类重写父类的类加载方法(一般是重写findClass() 方法)