Jetty源码阅读---Jetty的类加载器WebAppClassLoader

本文深入探讨Jetty的WebAppClassLoader如何实现类加载机制,满足Servlet规范对Web容器的特殊要求。内容涵盖WebAppClassLoader如何处理系统类和Server类的加载,以及URLClassPath的构建,确保WEB-INF/classes和WEB-INF/lib的优先级高于父类加载器,并实现应用间的依赖隔离。
摘要由CSDN通过智能技术生成

前面介绍了java中类加载的一般模型:双亲委派模型,这个模型适用于大多数类加载的场景,但对于web容器却是不适用的;这是因为servlet规范对web容器的类加载做了一些规定,简单的来说有以下几条:

1.WEB-INF/classes和WEB-INF/lib路径下的类会优先于父容器中的类加载,比如WEB-INF/classes下有个ABC类,CLASSPATH下也有个ABC类,jetty会优先加载WEB-INF/classes下的,这与双亲委托模型下的加载行为相反。
2.java.lang.Object等系统类不遵循第一条, WEB-INF/classes或WEB-INF/lib中的类不能替换系统类。对于哪些是系统类,其实没有做出具体规定,jetty中是通过枚举了一些类来进行判断的。
3.Server容器的实现类不被应用中的类引用,即Server的实现类不能被任何应用类加载器加载。对于哪些是系统类,也是通过枚举类的全限定名来实现的。

为了实现上面的三个要求并实现不同部署应用间依赖的隔离,jetty定义了自己的类加载器WebAppClassLoader,通过对这个类加载器使用线程上下文加载模式来达到目的。

1.WebAppClassLoader

WebAppClassLoader是URLClassLoader的子类,重写了其loadClass方法。下面就从这个方法的源码入手:

 @Override
    protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
    {
        //先检查是否已经加载
        Class<?> c= findLoadedClass(name);
        ClassNotFoundException ex= null;
        //是否父加载器优先,这里默认是false
        boolean tried_parent= false;
        //要加载的类是否是系统类
        boolean system_class=_context.isSystemClass(name);
        //要加载的类是否是Server类
        boolean server_class=_context.isServerClass(name);

        //如果即是系统类又是Server类,则不进行任何加载操作,直接返回
        if (system_class && server_class)
        {
            return null;
        }

        //如果类还没加载过并且父加载器不为空并且是系统类或父加载器优先并且不是server类,则用父加载器加载
        if (c == null && _parent!=null && (_context.isParentLoaderPriority() || system_class) && !server_class)
        {
            tried_parent= true;
            try
            {
                c= _parent.loadClass(name);
                if (LOG.isDebugEnabled())
                    LOG.debug("loaded " + c);
            }
            catch (ClassNotFoundException e)
            {
                ex= e;
            }
        }

       //优先使用当前WebAppClassLoader的findClass()方法进行加载
        if (c == null)
        {
            try
            {
                c= this.findClass(name);
            }
            catch (ClassNotFoundException e)
            {
                ex= e;
            }
        }

       //如果当前类加载器加载不到
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值