类加载器

定义

  实现类加载阶段中的“通过一个类的全限命名来拿到描述此类的二进制字节流”这个动作的代码模块称为“类加载器”。

  类加载器尽管只用于落实类的加载动作,但它在Java程序中起到的功能却远远不限于类加载阶段。比如判断四个类是否“相等”,唯有五个类是由同一个类加载器加载的前提下才有含义。

类加载器类型

  从Java虚拟机的角度来讲,只存在两连串加载器:
  * 启动类加载器(Bootstrap
ClassLoader),这么些类加载器使用C++语言实现,是虚拟机自身的一有的;
  *
另一种就是兼具其他的类加载器,这多少个类加载器都是由Java语言实现,独立于Java虚拟机外部,并且全体连续java.lang.ClassLoader。

  从Java开发人士的角度讲,有以下几序列加载器:
  * 启动类加载器(Bootstrap ClassLoader),负责将存放在在

父母委派模型

  图片 1

  上图展现的是类加载器之间的层系关系,成为类加载器的父大姨委派模型(Parents
Delegation
Model)。类加载器双亲委派模型要求除了顶层的启航类加载器外,另外的类加载器都应有有温馨的父类加载器。这里的类加载器之间的父子关系不是透过连续实现的,都是采取组合关系来复用父加载器的代码。
  类加载器双亲委派模型的干活进程:如若一个类加载器收到类加载的哀求,它首先把那些请求委派给父类加载器去做到,每一层次的类加载器都是这样,因而所有的类加载请求都应该传到顶层的起步类加载器中,只有当父类加载器反馈自己不可以到位这多少个加载请求时,子加载器才会尝试自己去加载。

大人委派模型优缺点

  使用双亲委派模型来公司类加载器之间的关系,有个好处是:Java类随着它的类加载器一起怀有了一种含有优先级的层次关系。
  由于只好提升委派,到了开行类加载器后无法往下询问,即顶层的类加载器,不可以访问底层的类加载器所加载的类。那么会冒出以下境况:在启动类加载器加载的系统类中有一个接口,接口提供一个厂子方法用于创建该接口的实例,可是该接口的实现类在应用层中,接口和工厂方法在开行类加载器中,就会油可是生工厂方法无法创立由应用类加载器加载的行使实例问题。
  为了缓解这么些题材,Java设计团队引入了:线程上下文类加载器(Thread
Context
ClassLoader)。这多少个类加载器可以经过java.lang.Thread类的setContextClassLoader()方法开展设置。

相关文章