类加载器

作者: 烟雨乱平生 | 来源:发表于2019-10-14 14:00 被阅读0次

    类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类加载阶段。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名空间。这句话可以表达的更通俗一些:比较两个类是否“ 相等”,只有在这两个类在同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个Class文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那么这两个类必不相等。

    双亲委派模型

    从Java虚拟机的角度来讲,只存在两种不同的类加载器,一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分;另一种就是所有其他的类加载器,这些类加载器都由Java语言实现,独立于虚拟机外,并且都继承与抽象类java.lang.ClassLoader。

    从Java开发人员角度来看,类加载器还可以划分的更细一些,绝大部分Java程序都会使用到以下3种系统提供的类加载器:

    • 启动类加载器(BootStrap ClassLoader):这个类加载器负责将存放在<JAVA_HOME>\lib目录种的,或者被-Xbootclasspath参数指定的路径中的,并且是虚拟机识别的类库加载到虚拟机内存中。启动类加载器无法被Java程序直接引用,用户编写自定义类加载器时,如果需要把加载请求委托给引导类加载器,那么直接使用null代替即可。
    • 扩展类加载器(Extension Class Loader):这个加载器由sun.misc.Launcher$ExtClassLoader实现,他负责加载<JAVA_HOME>\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。
    • 应用程序类加载器(Application Class Loader):这个类加载器由sun.misc.Launcher$AppCLassLoader实现。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也称他为系统类加载器。他负责加载用户类路径上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

    双亲委派模型并不是一个强制性的约束模型,而是Java设计者推荐给开发者的一种类加载器实现方式。


    image.png

    双亲委派模型的工作过程是:如果一个类加载器接收到了类加载请求,他首先不会自己去尝试加载这个类,而是把这个类的请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。

    相关文章

      网友评论

        本文标题:类加载器

        本文链接:https://www.haomeiwen.com/subject/tqtkyctx.html