zoukankan      html  css  js  c++  java
  • 线程上下文类加载器

      Java 提供了很多服务提供者接口(Service Provider Interface,SPI),允许第三方为这些接口提供实现。常见的 SPI 有 JDBC、JCE、JNDI、JAXP 和 JBI 等。

      这些 SPI 的接口由 Java 核心库来提供,而这些 SPI 的实现代码则是作为 Java 应用所依赖的 jar 包被包含进类路径(CLASSPATH)里。SPI接口中的代码经常需要加载具体的实现类。那么问题来了,SPI的接口是Java核心库的一部分,是启动类加载器来加载的;SPI的实现类是由系统类加载器来加载的。启动类加载器是无法找到 SPI 的实现类的,因为它只加载 Java 的核心库。它也不能委派给系统类加载器,因为它是系统类加载器的祖先类加载器。

      线程上下文类加载器正好解决了这个问题。如果不做任何的设置,Java 应用的线程的上下文类加载器默认就是系统上下文类加载器。在 SPI 接口的代码中使用线程上下文类加载器,就可以成功的加载到 SPI 实现的类。线程上下文类加载器在很多 SPI 的实现中都会用到。

      而线程上下文类加载器破坏了“双亲委派模型”,可以在执行线程中抛弃双亲委派加载链模式,使程序可以逆向使用类加载器。

      线程上下文类加载器(context class loader)是从 JDK 1.2 开始引入的。类 java.lang.Thread中的方法 getContextClassLoader()和 setContextClassLoader(ClassLoader cl)用来获取和设置线程的上下文类加载器。如果没有通过 setContextClassLoader(ClassLoader cl)方法进行设置的话,线程将继承其父线程的上下文类加载器。Java 应用运行的初始线程的上下文类加载器是系统类加载器。在线程中运行的代码可以通过此类加载器来加载类和资源。

      拿JNDI为例,它的核心是由JRE核心类(rt.jar)实现的,要由启动类加载器去加载。但这些核心JNDI类必须能加载由第三方厂商提供的JNDI实现,但是这个不能用启动类加载器去加载。解决办法就是让核心JNDI类使用线程上下文类加载器,从而有效的打通类加载器层次结构,逆着代理机制的方向使用类加载器。

  • 相关阅读:
    print(end=" ") 滚动输出到屏幕
    写入到csv文件的两种方式(pd.DaaFrame 和 csv.writerow)
    pytorch 损失函数(nn.BCELoss 和 nn.CrossEntropyLoss)(思考多标签分类问题)
    pytorch实战(二)hw2——预测收入是否高于50000,分类问题
    信用卡新颖的攻击方式,黑客可非接触式卡进行交易
    微软结束对SolarWinds黑客的内部调查
    Apple M1芯片首款恶意软件曝光
    新的Office恶意软件,黑客可远程窃取信息
    如何审核Active Directory中的密码更改
    特斯拉恶意软件使用新的传送和规避技术
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/7845173.html
Copyright © 2011-2022 走看看