线程上下文类加载器

线程上下文类加载器(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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值