ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 线程上下文类加载器 线程上下文类加载器## TCC( Thread Context ClassLoader) 是从JDK1.2 引入的,类Thread 的`getContextClassLoader()`与`setContextClassLoader(Classloader var1)`分别用来设置线程的上下文类加载器。如果没有指定线程的上下文的加载器,那么线程将会继承父线程的上下文类加载器。Java 的初始化线程的上下文加载器,可以通过上下文类加载器加载类与资源 基本的获取和使用方法: ``` public class ContextClassLoader { /** * 每个类都会使用自己的类加载器尝试去加载所依赖的类 * * <p>如果ClassX 依赖了 ClassY ,那么在ClassX的加载器将会在主动引用ClassY 并且ClassY尚未被加载的时候加载ClassY 这个类 */ public static void main(String[] args) { System.out.println(Thread.currentThread().getContextClassLoader()); System.out.println(Thread.class.getClassLoader()); } } ``` ### TCC 的作用: 改变双亲委托模型 SPI的实现模式中加载器双亲委派模型存在一个缺陷,为解决问题JVM设计者做了一个不太优雅的的方式解决,就是线程上下文类的加载器,父ClassLoader可以使用 Thread.currentThread().getContextClassloader() 所指定的Classloader 加载类,这就改变了父ClassLoader不能使用子ClassLoader加载的类以及其他没有父子关系的加载器加载类的访问情况,即改变了双亲委托模型 ***** 【知识点】 * 当高层提供了统计的接口让低层去实现,同时又要在高层加载(或者实例化)这个类,那么就必须通过线程上下文类加载器帮助高层ClassLoader 加载这个类 * 父加载器不能访问使用子加载器加载的类,子加载器可以访问使用父加载器加载的类 * 就SPI服务而言,有些接口是启动类加载器加载,但具体的实现各个厂商有自己不同的实现方式,这些实现是不会被启动类加载器加载的,这样传统的双亲委托机制就无法满足 SPI 的要求。而通过设置当前线程的上下类加载器,就可以通过当前线程的上下文类加载器加载这些类。 > Java中所有涉及SPI的加载动作都采用这种方式, 实现方案包括:  JDBC、JNDI、JCE以及JBI等