线程上下文类加载器

来源:互联网 发布: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();

0 0
原创粉丝点击