线程上下文类加载器(Context Classloader)
线程上下文类加载器是从JDK1.2开始引入的,类Thread中的getContextClassloader()和setContextClassloader()方法分别是获取当前线程上下文类加载器和设置线程上下文类加载器。
如果没有通过setContextClassloader()设置线程上下文类加载器,那么线程将继承其父线程的上下文加载器,Java运行时其初始线程的上下文类加载器为AppClassloader,在线程中运行的代码可以通过此加载器去加载类和资源。
线程上下文类加载器的重要作用:
SPI(Service Provide Interface)
父classloader可以使用当前线程类加载器Thread.currentThread().getContextClassloader()所加载的类,这就改变了父加载器不能加载子加载器所加载的类以及没有父子关系的Classloader所加载的类,即改变了双亲委托模型。
线程上下文加载器就是当前线程的Current Classloader
在双亲委托模型下,类加载是由下至上的,即下层类加载器会委托上层类加载器去加载所需要的类,但是对于SPI来说,有些接口是JAVA核心库所提供的的,而Java核心库是由启动类加载器来加载的,而这些接口的实现却来自不同的jar包(厂商提供),Java启动类加载器不会加载其他来源的jar包,这样传统的双亲委托模型就不能满足SPI的需求,而通过设置线程上下文类加载器就可以由线程上下文类加载器去加载相应的类。