类加载原理及双亲委托模型
类加载原理及双亲委托模型
我看见双亲委托模型的时候,第一反应是把关注点放在了“双”上,以为它有两个父类。其实,这里的双亲,就是指父类。
当一个ClassLoader实例需要加载某个类时,它不会首先自己去寻找(搜索)这个类,而是把这个任务委托给它的父类加载器,这个过程是由上至下依次检查的,首先由最顶层的BootStrap ClassLoader
试图加载,如果没有加载到(不在它管控的范围),则把任务交给Extension ClassLoader
,如果也没加载到,则继续转交给App ClassLoader
进行加载,如果它也没有加载得到的话,则返回给委托的发起者,由它到指定的文件系统或者网络等URL中加载该类。如果它们都没有加载到这个类时,则抛出ClassNotFoundException;否则将这个找到的类生成一个类的定义,并将它加载到内存中,最后返回这个类在内存中的Class实例对象。
同一份class字节码文件,但是由于被两个不同的ClassLoader实例所加载,所以JVM认为它们就是两个不同的类。
上图引用自xyang0917的深入分析Java ClassLoader原理
验证ClassLoader加载类的原理
打印ClassLoader类的层次结构
|
|
输出结果如下:
|
|
输出结果解释:
- 第一行结果说明:ClassLoaderTest的类加载器是AppClassLoader。
- 第二行结果说明:AppClassLoader的类加器是ExtClassLoader,即parent=ExtClassLoader。
- 第三行结果说明:ExtClassLoader的类加器是Bootstrap ClassLoader,因为Bootstrap ClassLoader不是一个普通的Java类,所以ExtClassLoader的parent=null,所以第三行的打印结果为null就是这个原因。
Tomcat自定义了几个类加载器
实验版本是apache-tomcat-8.5.23
新建一个自定义Servlet
|
|
在web.xml中配置Servlet
|
|