博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程上下文类加载器本质剖析与实现
阅读量:4965 次
发布时间:2019-06-12

本文共 822 字,大约阅读时间需要 2 分钟。

在上一次【】对线程上下文类加载器进行理论化的了解,这里回忆一下重点之处:

这里以JDBC的这种SPI场景用图来更具体的描述一下:

而根据这个理论:

很明显JDBC会去引用JDBCImpl的具体厂商的实现,而JDBC标准是由根类加载器所加载,那对于具体实现厂商的类也会用根类加载器去加载,而由于它们是处于工程中的classPath当中,很显然是没办法由根类加载器去加载的,为了解决这个问题,线程的上下文类加载器就发挥作用了,下面举一些示例代码来对它有进一步的认识:

其结果是:

第一个输出当前线程的上下文类加载器为应用类加载器,原因如之前的理论:

那思考一下:为什么默认的线程上下文类加载器就是系统类加载器呢?肯定是在某个地方给设置了,其实它是在Launcher中进行设置的,如下:

好,这个比较容易理解~~下面还有一些理论化的东东需要再说明一下:

  • 线程上下文类加载器的一般使用模式(获取 - 使用 - 还原),示例如下:
    其由myMethod()里面则调用了Thread.currentThread().getContextClassLoader()获取当前线程的上下文类加载器做某些事情。
  • 如果一个类由类加载器A加载,那么这个类的依赖类也是由相同的类加载器加载的(如果该依赖类之前没有被加载过的话),ContextClassLoader的作用就是为破坏Java的类加载委托机制。
  • 当高层提供了统一的接口让低层来实现,同时又要在高层加载(或实例化)低层的类时,就必须要通过线程上下文类加载器来帮助高层的ClassLoader找到并加载该类。

其实这个线程上下文类加载器有点像ThreadLocal,在任何需要的时候都可以通过Thread.currentThread().getContextClassLoader()来获取上下文类加载器。

转载于:https://www.cnblogs.com/webor2006/p/9248806.html

你可能感兴趣的文章
JAVA 上传图片功能
查看>>
编程中i++与++i的区别
查看>>
[8.2] Robot in a Grid
查看>>
Angular4 后台管理系统搭建(9) - 用自定义angular指令,实现在服务端验证
查看>>
ThinkPHP中:RBAC权限控制的实习步骤
查看>>
[转](.NET Core C#) AES Encryption
查看>>
[转]EntityFramework中常用的数据修改方式
查看>>
[转]SQL Collation冲突解决 临时表
查看>>
[转]Gitlab-CI持续集成之Runner配置和CI脚本
查看>>
Spark&Hive结合起来
查看>>
使用Flex和java servlet上传文件
查看>>
软件工程的实践项目课程的自我目标
查看>>
POJ 1321 棋盘问题 (深搜)
查看>>
自定义TabBar
查看>>
最近戴着眼镜坐电脑前总是不自觉的眼痛就搜了下怎么保护眼睛无意中看到了这篇文章希望广大爱好编程的朋友多注意保护自己的眼睛!!...
查看>>
Eclipse快捷键大全
查看>>
Let's Chat ZOJ - 3961
查看>>
该不该主动去联系多年未联系的老同学?看完这篇文章你再回答
查看>>
业务逻辑漏洞个人经验集锦【不定时更新~】
查看>>
[Swift] Storyboard outlet and action
查看>>