首页 > 其他分享 >简单分析Tomcat中WebappClassLoader的loadClass方法

简单分析Tomcat中WebappClassLoader的loadClass方法

时间:2023-01-18 22:32:34浏览次数:50  
标签:loadClass tomcat jar WebappClassLoader Tomcat 双亲 加载


tomcat自定义在Java的双亲委派机制的基础上进行了修改。甚至于为了各个服务直接相互隔离,直接打破了双亲委派机制。



那么什么叫打破双亲委派机制呢?

我们都知道tomcat是一个容器,容器是可以存放我们的项目,并且可以部署不止一个项目。如果A项目和B项目共同使用到了一个类库,但是两个类库的版本不一样,如果还是使用传统的双亲委派机制,那么在加载这个不同版本的类的时候必然会加载到同一个类,这是我们不希望看到的。基于此,tomcat打破双亲委派机制,对应用类加载器进行了扩展,于是也就衍生出了SharedClassLoader类加载器、WebappClassLoader类加载器。于是也就出现了下面这幅图,最底下的WebappClassLoader也就是本文的重点。



简单分析Tomcat中WebappClassLoader的loadClass方法_Web


当我们在自定义一个类加载时,核心的方法有两个findClass(在什么位置找到类)、loadClass(在什么地方加载类)。所以当我们查看WebappClassLoader时,也就可以直接定位到loadClass方法,顺着这条主线向下走,于是就有了下面这幅结构图。



简单分析Tomcat中WebappClassLoader的loadClass方法_java_02


tomcat的WebappClassLoader本身并没有太多的逻辑,其对应的loadClass和findClass均在它的父类WebappClassLoaderBase中,即入口为下图方法



简单分析Tomcat中WebappClassLoader的loadClass方法_jar_03


加载类的核心方法为findResourceInternal方法,主要完成的功能为:

  1. 根据指定的路径依次去遍历所有的jar包(tomcat在启动过程中会将扫描到的jar包存放到一个名为jarFiles的JarFile数组变量中);
  2. 然后获取到jar下符合需要加载的类信息,即找到需要加载的类对应jar包中通的class文件(对应源码Java代码的变量为jarEntry)
  3. 然后把找到的这个class文件,封装为一个ResourceEntry类的对象,然后存放到一个resourceEntries的Map集合中,这样下次获取的时候就能直接去这个map中获取,这个也是loadClass的第一步
  4. 其中还涉及记录热加载需要涉及的最后一次修改时间,以及文件的数量等细节,都是为热加载服务 的。


标签:loadClass,tomcat,jar,WebappClassLoader,Tomcat,双亲,加载
From: https://blog.51cto.com/u_15942107/6019544

相关文章

  • docker部署Tomcat时指定时区
    dockerstoptomcat#停止服务dockerrmtomcat#删除服务dockerrun-d-p8080:8080--restart=always--nametomcat-yefeng-eTZ=“Asia/Shanghai”-v/var/tomcat/......
  • tomcat负载高查询方法
    整体思路与流程:1先定位tomcat的线程2各种导出统计线程、进程信息3与开发一起查看基础排查流程:1通过psaux/top命令排查出tomcat有问题2通过top-Hptomcatpid......
  • [tomcat]context-securityManager
    示意图简述1. tomcat为平台,如果应用A调用了平台的例如退出方法,将会导致tomcat停机和其他应用都停止服务2. securityManager通过-Djava.security.manager开启-......
  • 报错Error running 'Tomcat 9.0.68': Can't find catalina.jar【解决办法】
    修改tomcat路径,肯定是你移动了jar包在硬盘的位置  将路径改成当前所在的文件位置 ......
  • 【Javaweb】给tomcat添加第三方jar包
    就是复制到lib文件夹里面之后点击jar包右键 选择modulelibrary,点击ok就可以了 ......
  • 【问题解决】Tomcat启动服务时提示Filter初始化或销毁出现java.lang.AbstractMethodEr
    问题背景最近在开发项目接口,基于SpringBoot2.6.8,最终部署到外置Tomcat8.5.85下,开发过程中写了一个CookieFilter,实现javax.servlet.Filter接口,代码编译期正常。部署到外......
  • 【Javaweb】tomcat目录介绍
    bin专门用来存放tomcat服务器的可执行程序conf专门用来存放tomcat服务器的配置文件lib专门用来存放tomcat服务器的jar包logs专门用来存放tomcat服务器运行时输出的......
  • Servlet1 - Servlet&Tomcat配置与启动
    Servlethtml中,form表单的method=post|action=add发送到服务器后根据add映射到相对应的服务器需要在web.xml中配置服务器映射用户发送请求,action=add,项......
  • 在Linux环境下将war包部署到tomcat
    部署前先简单认识几个运维工具:MobaXterm、xshell、WinSCP、CRT。常见压缩格式的压缩与解压命令:ZIP:解压--unzip压缩包名.zip压缩--zip-r压缩包名.zip......
  • Linux下JDK和Tomcat安装
    下载地址​​​http://www.oracle.com/technetwork/java/javase/downloads/index.html​​​http://download.oracle.com/otn-pub/java/jdk/8u31-b13/jdk-8u31-linux-......