JVM类加载
1.根类加载器:BootstrapClassLoader
由C++编写,没有父加载器,加载JVM核心类库(jdk/jre/lib目录下),没有继承java.lang.ClassLoader
2.扩展类加载器:ExtensionClassLoader
由Java实现,父加载器为Bootstrap,加载扩展类库(jdk/jre/lib/ext目录下),继承java.lang.ClassLoader
3.系统类(应用类)加载器:AppClassLoader
由Java实现,父加载器为Extension,加载环境变量classpath或系统属性java.class.path目录中加载类库,继承java.lang.ClassLoader,它是用户自定义类加载器的默认父加载器
4.用户自定义类加载器:User defined Class Loader
必须继承java.lang.ClassLoader
注:父子类加载器并非是继承关系,也就是说子加载器不一定继承了父加载器
双亲委派模型
1.双亲委派模型
类加载器之间的委托机制,就是双亲委派模型
2.双亲委派模型工作过程
当一个类加载器,接收到类加载请求之后,会先委托给父加载器,每一层加载器都是如此,最终先由BootstrapClassLoader加载,如果父加载器加载不了,再由子加载器加载,当所有加载器加载不了,就会报出ClassNotFound
3.父委托机制的优点
提高了系统的安全性,如果不是父委托机制,那么就是我自己定义的恶意类可以让我自己的类加载器加载,从而造成系统的风险
TomcatClassLoader的委托机制
1.TomcatClassLoader执行流程
Tomcat违反了双亲委派模型;当接收到类加载请求后,没有委托给上层的commonClassLoader,而是委托给了SystemClassLoader,然后自己加载,最后才委托给commonClassLoader
2.违反双亲委派的例子
Tomcat、JDBC、JNDI、OSGi
Tomcat的类加载顺序
当应用需要用到某个类时,则会按照下面的顺序进行类加载
- 使用bootstrap引导类加载器加载
- 使用system系统类加载器加载
- 使用应用类加载器在WEB_INF/classes中加载
- 使用应用类加载器在WEB_INF/lib中加载
- 使用common类加载器在CATALINA_HOME/lib中加载