类加载器

本文最后更新于:3 年前

类加载器

作用:加载Class文件。

加载是将类的class文件读入到内存,并为之创建一个java.lang.Class对象。

加载器的类型

启动类加载器BootstrapClassLoader:

​ 是嵌在JVM内核中的加载器,该加载器是用C++语言写的,主要负载加载JAVA_HOME/lib下的类库,启动类加载器无法被应用程序直接使用。

扩展类加载器Extension ClassLoader:

 该加载器器是用JAVA编写,且它的父类加载器是Bootstrap,是由sun.misc.Launcher$ExtClassLoader实现的,主要加载JAVA_HOME/lib/ext目录中的类库。开发者可以这几使用扩展类加载器。

系统类加载器App ClassLoader:

系统类加载器,也称为应用程序类加载器,负责加载应用程序classpath目录下的所有jar和class文件。它的父加载器为Ext ClassLoader。

三种类加载器的层次关系

注意:

类加载器的体系并不是“继承”体系,而是委派体系,大多数类加载器首先会到自己的parent中查找类或者资源,如果找不到才会到自己本地查找。类加载器的委托行为动机是为了避免相同的类被加载多次

类加载的过程

类的加载过程

  • 加载:通过一个类的完全限定查找此类字节码文件,并利用字节码文件创建一个Class对象

  • 链接

    • 验证:验证被加载的类的正确性 。主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证。
    • 准备:为类的静态变量分配内存,并将其初始化为默认值 。
    • 解析:把类中的符号引用转换为直接引用 。
  • 初始化:为类的静态变量赋予正确的初始值。

双亲委派机制

工作原理:如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式,

双亲委派过程图

优势

  • 类加载器使得Java类一起具备了带有优先级的层次关系,可以避免类的重复加载(当父亲已经加载了该类时,就没有必要子、ClassLoader再加载一次)
  • 更加安全,java核心api中定义类型不会被随意替换。

参考

CSDN-zejian_

超级战斗王

bilibili-遇见狂神说


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!