本文介绍: 一个tomcat中可以部署多个应用,而每个应用中都存在很多类,并且各个应用中的类是独立的,全类名是可以相同的,比如一个博客系统中可能存在com.data.User类,一个库存系统中可能也存在com.data.User类。一个tomcat,不管内部部署了多少应用,Tomcat启动之后就是一个Java进程,也就是一个JVM,所以如果Tomcat中只存在一个类加载器,比如默认的AppClassLoader,那么就只能加载一com.data.User类,这是有问题的 .
类加载器与类的”相同“判断
类加载器除了用于加载类外,还可用于确定类在Java虚拟机中的唯一性。
不同类加载器加载的类在 JVM 看来是两个不同的类,因为在 JVM 中一个类的唯一标识是 类加载器+类名(包括包名)。
类加载器种类
启动类加载器,Bootstrap ClassLoader,加载JAVA_HOMElib,或者被-Xbootclasspath参数限定的类
扩展类加载器,Extension ClassLoader,加载libext,或者被java.ext.dirs系统变量指定的类
应用程序类加载器,Application ClassLoader,加载ClassPath中的类库
自定义类加载器,通过继承ClassLoader实现,一般是加载我们的自定义类
双亲委派的关键源代码
JVM 在触发类加载时调用的是 ClassLoader.loadClass 方法。这个方法的实现了双亲委派:先检查指定类(应该仅是包名+类名,不包括类加载器)是否已经被加载过;
若否则递归调用父类加载器的loadClass()方法查询,(父类非指继承,而是指组合的parent变量);
若递归调用失败,就调用本ClassLoader的findClass()进行加载。
我:简单来说,若不想破坏双亲委派,则不要改loadClass()方法,只能改findClass()。
JAVA热部署
首先谈一下何为热部署(hotswap),热部署是在不重启 Java 虚拟机的前提下,能自动侦测到 class 文件的变化,更新运行时 class 的行为。
一种实现的方法是创建自己的 classloader 来加载需要监听的 class,这样就能控制类加载的时机,从而实现热部署:
Tomcat独特的类加载机制1,2
tomcat为什么要使用自定义类加载器?
Tomcat如何实现自己独特的类加载机制?
使用自定义类加载器解决JAR包多版本冲突问题3
附:
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。