简单分析Tomcat中WebappClassLoader的loadClass方法
Posted 默辨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单分析Tomcat中WebappClassLoader的loadClass方法相关的知识,希望对你有一定的参考价值。
tomcat自定义在Java的双亲委派机制的基础上进行了修改。甚至于为了各个服务直接相互隔离,直接打破了双亲委派机制。
那么什么叫打破双亲委派机制呢?
我们都知道tomcat是一个容器,容器是可以存放我们的项目,并且可以部署不止一个项目。如果A项目和B项目共同使用到了一个类库,但是两个类库的版本不一样,如果还是使用传统的双亲委派机制,那么在加载这个不同版本的类的时候必然会加载到同一个类,这是我们不希望看到的。基于此,tomcat打破双亲委派机制,对应用类加载器进行了扩展,于是也就衍生出了SharedClassLoader类加载器、WebappClassLoader类加载器。于是也就出现了下面这幅图,最底下的WebappClassLoader也就是本文的重点。
当我们在自定义一个类加载时,核心的方法有两个findClass(在什么位置找到类)、loadClass(在什么地方加载类)。所以当我们查看WebappClassLoader时,也就可以直接定位到loadClass方法,顺着这条主线向下走,于是就有了下面这幅结构图。
tomcat的WebappClassLoader本身并没有太多的逻辑,其对应的loadClass和findClass均在它的父类WebappClassLoaderBase中,即入口为下图方法
加载类的核心方法为findResourceInternal方法,主要完成的功能为:
- 根据指定的路径依次去遍历所有的jar包(tomcat在启动过程中会将扫描到的jar包存放到一个名为jarFiles的JarFile数组变量中);
- 然后获取到jar下符合需要加载的类信息,即找到需要加载的类对应jar包中通的class文件(对应源码Java代码的变量为jarEntry)
- 然后把找到的这个class文件,封装为一个ResourceEntry类的对象,然后存放到一个resourceEntries的Map集合中,这样下次获取的时候就能直接去这个map中获取,这个也是loadClass的第一步
- 其中还涉及记录热加载需要涉及的最后一次修改时间,以及文件的数量等细节,都是为热加载服务 的。
以上是关于简单分析Tomcat中WebappClassLoader的loadClass方法的主要内容,如果未能解决你的问题,请参考以下文章