线程上下文类加载器分析与实现

在上一次【https://www.cnblogs.com/webor2006/p/9246850.html】分析源码中发现有两处设置线程上下文类加载器的代码,如下:

因为它是非常重要的东东,所以这次专门对它进行主题展开,主要的作用为了改变委托双亲模式在某些场景不太适用或者是无法满足需求的,下面先写一个简单的测试代码:

那输出是啥呢?

也就是说当前线程的上下文类加载器是应用类加载器,而第二输出null不足为奇,因为Thread是JDK中的系统类当然是由启动类加载器加载喽。

对于上面的例子先有一个初浅的认识既可,在正式介绍线程的上下文类加载器之前需要介绍一些理论性的东东,只有明白了它的背景这样才能更好的掌握它,具体如下:

  • 当前类加载器(Current ClassLoader):每一个类都会使用自己的类加载器(既加载自身的类加载器)来去加载其它类(指的是所依赖的类),如果ClassX引用了ClassY,那么ClassX的类加载器就会加载ClassY(前提是ClassY尚未被加载)。
  • 线程上下文类加载器(Context ClassLoader):线程上下文类加载器是从JDK1.2开始引入的,类Thread中的getContextClassLoader()与setContextClassLoader(ClassLoader cl)分别用来获取和设置上下文类加载器。如果没有通过setContextClassLoader(ClassLoader cl)进行设置的话,线程将继承其父线程的上下文类加载器。Java应用运行时被始线程的上下文类加载器是系统类加载器【所以这也是为啥上面的第一行输出是系统类加载器的原因之所在】。在线程中运行的代码可以通过该类加载器来加载类与资源。
  • 线程上下文类加载器的重要性:
    我们在使用JDBC操作数据库时会如下进行编写:

猜你喜欢

转载自www.cnblogs.com/webor2006/p/9248621.html