类加载器
在分析 tomcat 类加载之前,我们简单的回顾下 java 体系的类加载器
- 启动类加载器(Bootstrap ClassLoader):加载对象是java的核心类库,把一些的 java 类加载到 jvm 中,它并不是我们熟悉的
ClassLoader
,而是 jvm 层面由 C/C++ 实现的类加载器,负责加载 $JAVA_HOME/jre/lib 目录下 jvm 指定的类库,它是无法被 java 应用程序直接使用的 - 扩展类加载器(Extension Classloader):它是一个 ClassLoader 实例,父加载器是启动类加载器,它负责加载 $JAVA_HOME/jre/lib/ext 目录的类库
- 应用类加载器(Application ClassLoader):又叫做系统类加载器(System ClassLoader),负责加载用户类路径(-cp参数)指定的类库,可以通过
ClassLoader.getSystemClassLoader()
获取,它也是由启动类加载器加载的 - 自定义类加载器:应用程序根据自己的需求开发的类加载器,可以继承
ClassLoader
,当然也可以不继承
下图描述了类加载器的关系图,其中自定义类加载器有N多个
我们知道 java.lang.ClassLoader
有双亲委派机制(准确的说是单亲,因为只有一个parent),这只是 java 建议的规范,我们也可以不遵循这条规则,但是建议遵循该规则。此外,有一