死磕Tomcat系列(4)——Tomcat中的类加载器

死磕Tomcat系列(4)——Tomcat中的类加载器

在学习Tomcat中的类加载器,并且Tomcat为什么要实现自己的类加载器打破双亲委派模型原因之前,我们首先需要知道Java中定义的类加载器是什么,双亲委派模型是什么。

Java中的类加载器

类加载器负责在程序运行时将java文件动态加载到JVM中

从Java虚拟机的角度来讲的话,存在两种不同的类加载器:

  • 启动类加载器(Bootstrap ClassLoader):这个类加载器是使用C++语言实现的,是虚拟机自身的一部分。

  • 其他的类加载器:这些类加载器都由Java语言实现,独立于虚拟机外部,并且全都继承自抽象类java.lang.ClassLoader,其中其他类加载器大概又分为

    • ExtensionClassLoader:这个类加载器由ExtClassLoader实现,它负责加载JAVA_HOME/lib/ext目录中的所有类,或者被java.ext.dir系统变量所指定的路径中所有的类。
    • ApplicationClassLoader:这个类加载器是由AppClassLoader实现的,它负责加载用户类路径(ClassPath)上所指定的所有类,如果应用中没有自定义自己的类加载器,那么一般情况就是程序中默认的类加载器。
    • 自定义加载器:根据自己需求,自定义加载特定路径的加载器。

对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性

双亲委派模型

上图中展示的层次结构,称之为类加载器的双亲委派模型。双亲委派模型要求除了顶层的启动类加载器外,其他加载器都应该有自己的父加载器。这里的父子关系不是通过继承来实现的,而是通过设置parent变量来实现的。

双亲委派模型工作过程是:如果收到一个类加载的请求,本身不会先加载此类,而是会先将此请求委派给父类加载器去完成,每个层次都是如此,直到启动类加载器中,只有父类都没有加载此文件,那么子类才会尝试自己去加载。

为什么要设置双亲委派模型呢?其实是为了保证Java程序的稳定运行,例如Object类,它是存放在rt.jar中,无论哪一个类加载器要加载Object类,最终都会委托给顶层的BootStrapClassLoader,所以所有的类中使用的Object都是同一个类,相反如果没有双亲委派模型的话,那么随意一个类加载器都可以定义一个新的Object类,那么应用程序将会变得非常混乱。其实双亲委派模型代码非常简单。实现在ClassLoader中的loadClass方法下。

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{
    synchronized (getClassLoadingLock(name)) {
        // 首先,检查请求类是否被加载过
        Class<?> c = findLoadedClass(name);
        if (c == null) {
            long t0 = System.nanoTime();
            try {
            // 如果没被本类类加载器加载过,先委托给父类进行加载
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值