线程上下文类加载器
2015-08-13 11:14
232 查看
线程上下文类加载器(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();
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();
相关文章推荐
- sdk manager 更新api
- ACM LIS 最长子序列问题
- 一个位压缩技巧
- Highways(求最小生成树的最大边)
- perl脚本语言练习
- C#计算矩阵的逆矩阵方法实例分析
- 读取文件指定行linecache
- 用Chrome在电脑上模拟微信内置浏览器
- JVM性能调优监控工具jps、jstack、jstat、jmap、jinfo使用详解
- java用户密码摘要加盐的两种方式
- jQuery中事情的动态绑定
- 面向过程和面向对象及面向对象的三大特征
- Windows 经典的宏——CONTAINING_RECORD
- solr4.7.2 索引远程文件内容
- 社説 20150813 福島原発浄化水 廃炉を前進させる海への放出
- CAShapeLayer
- [USACO Training]二进制数01串
- HDU 5349 MZL's simple problem(平衡树 树堆)
- 设计模式
- 简单的启动代码 IMPORT |Image$$RO$$Limit|