Java类加载器回顾
Posted 时间的朋友
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java类加载器回顾相关的知识,希望对你有一定的参考价值。
Java类加载采用了全盘委托机制,默认加载类时子类先会委托给父类加载,但父类加载不到时,子类才会自己尝试加载类。这种机制可以有效防止一个类被加载多次,同时也一定程度上防止重写JDK自身的类【Java自身要限制java开头的包下的类只能有根加载器加载】。但这种模式无法解决以下问题:
1、Java SPI应用场景,接口核心代码有根加载器加载,但接口实现类由第三方实现,在classpath下根加载器无法加载,同时根加载器无法委托它的子孙类加载器来加载这个类【它也不知道其子孙类加载器的存在?】,如何解决这个问题?使用线程上下文加载器,在根加载器加载的SPI接口代码部分,通过获取线程上下文类加载器实例【默认是系统类加载器】,用它来加载具体实现类,然后获取到类对象即可。
2、WEB容器的类加载需求,一般WEB容器的类加载要实现各应用不同类的隔离,同时也要能实现各应用公用类库的共享;要实现web应用与容器自身的类库的隔离与共享。因此它也不能完全使用父类委托加载机制实现。一般做法是各应用的类加载器首先在自己的目录下尝试加载类,加载不到再去请求父类加载该类【应用自身的类库优先于公用类库被加载】。Tomcat自身类加载机制设计时也遵循这样的思想,默认情况下web应用自身目录下的类库有应用类加载器加载,common共享目录下的类库有common类加载器加载。
以上是关于Java类加载器回顾的主要内容,如果未能解决你的问题,请参考以下文章