类装载器

是什么

我们敲的代码即.java文件经过编译之后得到.class文件,然后这个文件通过JVM的虚拟机加载的到内存中,并形成一个class对象,这个称之为类的加载过程,负责将.class字节码文件加载到内存的工具称之为类加载器。

下面来说说类加载的过程

过程

加载


  • 装载类的第一个阶段
  • 取得类的二进制流
  • 转为方法区数据结构
  • 在java堆中生成对应的java.lang.Class对象

链接

验证

  • 目的:保证class流的格式是正确的

    • 文件格式的验证

      • 是否以0xCAFEBABE开头
      • 版本号是否合理


    • 元格式的验证

      • 是否有父类
      • 基础了final类
      • 非抽象类实现了所有的抽象方法


    • 字节码验证

      • 运行检查
      • 栈数据类型和操作码数据参数吻合
      • 跳转指定指令到合理的位置


    • 符合引用验证

      • 常量池中描述类是否存在
      • 访问的方法或字段是否存在且有足够的权限




准备

  • 分配内存,并为类设置初始值(方法区中)
    JVM-类装载器_加载

解析

  • 符号引用替换为直接引用,class具体运行过程中,才能索引到它要引用的内容
    JVM-类装载器_java_02

初始化


  • 执行类构造器

    • static变量 赋值语句
    • static{}语句


  • 子类的调用前保证父类的被调用
  • 是线程安全的

什么是类装载器ClassLoader


  • ClassLoader是一个抽象类
  • ClassLoader的实例将读入java字节码将类装载到jvm中
  • ClassLoader可以定制,满足不同的字节码流获取方式
  • ClassLoader负责类装载过程中的加载阶段

jdk中ClassLoader默认设计模式

JVM-类装载器_加载_03