线程上下文类加载器
来源:互联网 发布:mint ubuntu 比较 编辑:程序博客网 时间:2024/04/29 16:21
线程上下文类加载器(context class loader)是从 JDK 1.2 开始引入的。类 java.lang.Thread中的方法 getContextClassLoader()和 setContextClassLoader(ClassLoader cl)用来获取和设置线程的上下文类加载器。如果没有通过 setContextClassLoader(ClassLoader cl)方法进行设置的话,线程将继承其父线程的上下文类加载器,如果在应用程序全局范围内都没设置,那么这个类加载器默认是app类加载器。
jdk的“双亲委派”模型很好的解决了各个类加载器的基础类的统一问题(越基础的类越由上层类加载器进行加载),基础类之所以被加载,是因为他们总是作为被用户调用的api,但事与愿违,如果基础类又要回调用户的代码,那该怎么办?
一个典型的例子是JNDI服务,JNDI已经是java的标准服务,他的代码由booter类加载器去加载,但JNDI需要调用各个厂商实现的JNDI接口提供者(SPI,server provider Interface)的代码,但是booter类加载器不可能加载到应用程序classpath下的这些实现类,怎么办?
为了解决上面问题,java提出了线程上下文类加载器(context class loader)。有了他,JNDI服务使用这个线程上下文类加载器去加载所需要的SPI代码,也就是父类加载器请求子类加载器去完成类加载动作,这实际上是打破了“双亲委派”模型,逆向使用类加载器。
【实例】在jdbc的类中使用下面代码,获取mysql的实现类对象
//在main方法运行时,当前线程类加载器就是app的类加载器,所以在booter类加载器加载jdbc代码时,可以通过下面方式获得mysql实现类、并调用其方法
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class<?> aClass = Class.forName("com.mysql.jdbc.Driver", true, cl);
//强转成jdk中的Driver接口
Driver test = (Driver)aClass.newInstance();
- 线程上下文类加载器
- 线程上下文类加载器
- Java线程上下文类加载器
- 线程上下文类加载器总结
- 类加载器-线程上下文类加载器
- 深入类加载器----线程上下文类加载器
- Java类加载器之线程上下文类加载器
- 深入类加载器----线程上下文类加载器
- 深入类加载器----线程上下文类加载器
- 线程上下文类加载器与服务器类加载原理
- 使用线程上下文类加载器加载class
- Java虚拟机(九):线程上下文类加载器
- java安全-线程上下文类加载器
- Java线程上下文类加载器与SPI
- 真正理解线程上下文类加载器:tomcat and Spring
- 上下文类加载器
- 深入理解Java类加载器(2):线程上下文类加载器
- 深入理解Java类加载器(2):线程上下文类加载器
- UVA - 10004 - Bicoloring(染色问题)
- 关于awt的BorderLayout布局管理器
- Could not create pool connection. The DBMS driver exception was: The Network Adapter could not estab
- 面试题之变态跳台阶
- qsort与sort的比较
- 线程上下文类加载器
- fn 标签库的使用
- java用户密码摘要加盐的两种方式
- Windows 经典的宏——CONTAINING_RECORD
- [USACO Training]二进制数01串
- 用Chrome在电脑上模拟微信内置浏览器
- Hash索引与B-Tree索引 介绍及区别
- POJ 1258 Agri-Net(最小生成树prim算法)
- 图像处理常用算法总结