
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在上文的类加载介绍中提到了双亲委派模型这一概念,而本文我们就继续来说说,双亲委派模型的概念与应用方法。
概述
定义:当一个类加载器收到加载请求时,自己不去加载,而是交给它的父加载器去加载,以此类推,知道传递到顶层的类加载器,只有当父加载器加载不了这个类,子加载器才会尝试加载这个类。
顶层加载器使用了虚线表示顶层加载器没有父加载器,从实现上来说,也没有子加载器,是一个独立的加载器,因为扩展类加载器和应用程序加载器从继承关系上来看,是有父子关系的,都继承了URLClassLoader,但是虽然从类的继承关系上启动类加载器没有子加载器,但是逻辑上扩展类加载器还是会将收到的请求优先交给启动类加载器进行优先加载。
启动类加载器:负责加载$JAVA_HOME\lib下的类或者被参数-Xbootclasspath指定的能够被虚拟机识别的类(通过jar名字识别,如rt.jar),启动类加载器由java虚拟机直接控制,开发者不能直接使用启动类加载器。
扩展类加载器:负责加载$JAVA_HOME\lib\ext下的类或者被java.ext.dirs系统变量指定的路径中所有类库,开发者可以直接使用这个类加载器。
应用程序类加载器:负责加载$CLASS_PATH中指定的类库,开发者能直接使用这个类加载器,正常情况下如果我们在应用程序中没有自定义类加载器,一般用的就是这个类加载器。
自定义类加载器:如果需要可以通过java.lang.ClassLoader的子类来定义自己的类加载器,一般我们选择继承URLClassLoader来进行适当改写就行了。
破坏双亲委派模型
双亲委派模型并不是一个强制性的约束模型,只是一种推荐的加载模型,也有不遵守这个模型的:比如JNDI,JDBC等相关的SPI动作并没有完全遵守双亲委派模型,破坏双亲委派模型的一个简单的方式就是:继承ClassLoader类,然后重写其中的loadClass方法(因为双亲委派的逻辑就在loadClass方法中)
常见异常
如果加载过程出现异常,可能抛出以下异常
ClassCircularityError:extends或者implements了自己的类或接口
ClassFormatError:类或接口的二进制格式不正确
NoClassDefFoundError:根据提供的全限定名找不到对应的类或者接口。
希望这辈子,最让你无悔的事情就是来达内学习!学习向来不是件易事,但无论过程多么艰难,希望你依然热爱生活,热爱学习!永远记得,达内将与你一同前行!现在扫码,立即领取万元课程礼包,助力0基础快速入行,为你梳理行业必备技能,全方位了解岗位发展前景!
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。