Linux 拨号vps windows公众号手机端

类加载器分类及原理解析:差异与应用

lewis 5年前 (2020-12-01) 阅读数 7 #VPS/云服务器

类加载器分类及原理解析:差异与应用

在Java中,类的加载是指将类装入Java虚拟机中以便执行程序。Java虚拟机通过一个类加载器(Class Loader)来查找和载入类。根据不同的载入方式和场景,类加载器可以分类,并存在明显的差异和应用。本文将从四个方面对类加载器进行分类及原理解析,分别为类加载器分类、双亲委派模型、类加载的顺序和类加载器的应用。

一、类加载器分类

按照加载类的不同源头和场景,类加载器可以分为以下三类:

1. 启动类加载器(Bootstrap ClassLoader)

启动类加载器是Java虚拟机的一部分,用于加载JRE核心库(JAVA_HOME/jre/lib/rt.jar)和其它基础模块(如JDK自带的一些jar包,如charsets.jar等)。启动类加载器是由C++实现的,是虚拟机里面最顶层的类加载器,不继承自java.lang.ClassLoader,不存在父类加载器。因为精简的运行环境,所以没有什么可配置的参数。

2. 扩展类加载器(Extension ClassLoader)

扩展类加载器专门用于加载Java平台扩展(Java extensions),即 JAVA_HOME/jre/lib/ext目录下的jar包以及javax.*开头的标准扩展包。扩展类加载器是由启动类加载器加载的,根据双亲委派模型,其父类加载器为启动类加载器,不存在子类加载器。

3. 应用程序类加载器(Application ClassLoader)

应用程序类加载器,也叫系统类加载器,主要用于加载应用程序classpath目录下的.class文件或jar包。应用程序类加载器是Java系统默认的类加载器,也是最常用的类加载器。应用程序类加载器和扩展类加载器一样,均继承于java.lang.ClassLoader。

二、双亲委派模型

双亲委派模型是Java类加载器的一个重要特征。Java虚拟机内置了启动类加载器,该类加载器无法找到所有的类,因此把加载类的任务交给CLASSPATH和用户自定义类加载器。双亲委派模型控制了类加载器之间的关系,保证类的平等性,避免类的重复加载。一般而言,父亲加载器会先试图加载类,只有在父亲加载器找不到的情况下才由子加载器试图加载类。这个过程避免了类的重复加载和冲突,同时保证了类的稳定性。

三、类加载的顺序

双亲委派模型中,类的加载是由父类加载器向下逐级委托,直至无法找到相应类的情况下,再由子类加载器进行类的加载。因此,类的加载顺序是自下而上的,即先加载子类,再加载父类。

当启动Java应用程序时,Java虚拟机会自动加载启动类(即类加载器层次的根),并启动类的最顶层父类加载器。根据双亲委派模型,父类加载器首先被请求载入一个类,父类加载器委派给它的子类加载器。(如果父类加载器没有子类加载器,则由父类加载器自己尝试加载该类,即最顶层的加载器,如果最顶层的加载器没能找到该类,弹出ClassNotFoundException异常)。如果第一个子类加载器不能载入该类,它将委派给它的父亲的另外一个子类加载器来尝试载入。如果这样的子类加载器不能载入该类,但是父亲自己的类加载器可以,就由父亲加载该类。

四、类加载器的应用

类加载器的使用足迹遍及全身,运用广泛。在以下几种场景中,类加载器得到广泛运用:

1. 动态生成和装载类

类加载器鼓励动态增加代码库和更改虚拟机的默认行为,动态生成和装载类是其典型应用。例如,在JavaEE应用服务器上部署新组件时,可以使用一个诸如URLClassLoader的类加载器,动态地从文件系统或HTTP服务器中读取应用程序组件。

2. 插件系统

Java应用程序也可以使用类加载器来实现插件系统。比如,Eclipse插件系统就使用了类加载器的概念。

3. 懒加载和性能优化

运用类加载器实现懒加载技术,可以提升系统的性能和速度。在大型的应用程序中,不可能在应用程序启动时引入所有的类和对象,因为这不仅浪费时间,还会消耗内存。相反,应用程序可以使用类加载器在运行时需要时动态添加所需的类。加载器还可以实现优化程序性能的目的,例如,将一个大的应用程序拆分为多个Jar文件,按需要动态加载和卸载。

五、总结

Java类加载器是Java虚拟机的核心部分,可以彼此继承并形成完整的类加载器体系。根据不同的实现和引用场景,类加载器存在差异和应用。本文从类加载器分类、双亲委派模型、类加载的顺序和类加载器的应用四个方面对类加载器进行了较为详细的阐述。全面掌握 Java 类加载器的分类及原理,对 Java 程序开发和理解 classloader 相关问题具有非常重要的作用。

版权声明

本文仅代表作者观点,不代表米安网络立场。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门