博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程上下文类加载器(Context ClassLoader)
阅读量:4572 次
发布时间:2019-06-08

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

1.线程上下文类加载器是从jdk1.2开始引入的,类Thread中的getContextClassLoader()与setContextClassLoader(ClassLoader c1),分别用来获取和设置类加载器

如果没有通过setContextClassLoader方法进行设置的话,线程将继承其父线程的上下文加载器,java应用运行时的初始线程的上下文类加载器是系统类加载器(这里是由Launcher类设置的)。在线程中运行的代码可以通过该类加载器来加载类和资源
2.线程上下文类加载器的重要性:
SPI(Service Provider Interface,服务提供者接口,指的是JDK提供标准接口,具体实现由厂商决定。例如sql)
父ClassLoader可以使用当前线程Thread.current.currentThread().getContextClassLoader()所指定的classLoader加载的类。这就改变了父ClassLoader不能使用子ClassLoader加载的类的情况,即改变了双亲委托模型。
线程上下文类加载器就是当前线程的CurrentClassloader。

在双亲委托模型下,类加载器是由下至上的,即下层的类加载器会委托上层进行加载。但是对于SPI来说,有些接口是JAVA核心库提供的,而JAVA核心库是由启动类加载器来加载的,而这些接口的实现却来自于不同的jar包(厂商提供),JAVA的启动类加载器是不会加载其他来源的jar包,这样传统的双亲委托模型就无法满足SPI的要求。而通过给当前线程设置上下文类加载器,就可以设置的上下文类加载器来实现对于接口实现类的加载。

 

3.线程上下文类加载器使用的一般模式:(获取-使用-还原)

伪代码:

1  ClassLoader classLoader = Thread.currentThread().getContextClassLoader();2  try{3     Thread.currentThread().setContextClassLoader(targetTccl);4     excute();5  } finally {6     Thread.currentThread().setContextClassLoader(classLoader);7  }

 

 

4.当高层提供了统一的接口让低层去实现,同时又要在高层加载(或者实例化)低层的类时,就必须要通过线程上下文类加载器来帮助高层的ClassLoader找到并加载该类

转载于:https://www.cnblogs.com/billmiao/p/9872211.html

你可能感兴趣的文章
GO语言练习:组合的用法
查看>>
(K)ubuntu上将分区格式化成NTFS格式
查看>>
面向对象的5条基本设计原则
查看>>
Hello World
查看>>
SQL Server 2005“备份集中的数据库备份与现有的数据库不同”解决方法
查看>>
如何在 Centos 7.x 上以源码包安装最新版 Git
查看>>
2017知乎看山杯总结(多标签文本分类)
查看>>
uva 12003 Array Transformer (大规模阵列)
查看>>
mysql5.7二进制包安装方式
查看>>
SQL With As 用法Sql 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
查看>>
装饰者模式——Java设计模式
查看>>
HTTP状态码
查看>>
39.递推练习: 菲波那契数列(2)
查看>>
47..贪心 失恋28天-追女孩篇
查看>>
排序精讲
查看>>
【bzoj3172】 Tjoi2013—单词
查看>>
【uoj2】 NOI2014—起床困难综合症
查看>>
js return的用法
查看>>
for_each使用方法详解[转]
查看>>
Apache Storm 与 Spark:对实时处理数据,如何选择【翻译】
查看>>