Tomcat类加载器

Java类加载器回顾

1.类的生命周期

从类被加载到虚拟机内存中开始,到卸载出内存为止,类的生命周期包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段,其中验证、准备和解析三部分称为连接。类的加载、连接、初始化过程都是在程序运行期间进行的。

2.类加载器定义

把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(Class Loader)。

3.Java虚拟机自带的类加载器

启动类加载器 (Bootstrap Class Loader) -->加载虚拟机的核心类库
扩展类加载器 (Extension Class Loader) -->加载系统属性java.ext.dirs指定位置的类库、加载jdk安装目录下面的$JAVA_HOME/lib/ext目录下的类库
应用程序类加载器 (Application Class Loader) -->加载classpath或者系统属性java.class.path所指位置的类库

4.用户自定义的类加载器

继承java.lang.ClassLoader,通过重写方法findClass/loadClass方法来实现自定义的委派机制/破坏委派机制的类加载器

5.双亲委派模型

所谓双亲委派机制是加载器在收到加载某个类的请求时,首先,它自己不会尝试去加载这个类,而是将请求委派给父加载器去完成,最终会委派给启动加载器(Bootstrap Class Loader)去完成,如果父加载器无法完成加载请求,则在将请求委派给子加载器去完成。

双亲委派模型意义:
可以确保java核心类库所提供的类不会被自定义的类所代替;
不同的类加载器可以为相同名称的类创建额外的命名空间,相同名称的类可以并存在java虚拟机中,但需要不同的类加载器来加载他们;
不同类加载器所加载的类之间是不兼容的,这就相当于在java虚拟机内部创建了多个相互隔离的java类空间;

注意:子加载器能访问到父加载器加载的类,但是反过来父加载器无法访问到子加载器所加载的类。

Tomcat类加载器介绍