类加载的过程

类加载的过程

类加载的过程主要有三个阶段:加载、链接、初始化

1、加载

  • 通过一个类的权限定名获取这个类的二进制字节流
  • 将此字节流所代表的静态存储结构转换为方法区中的运行时数据结构
  • 在堆中创建一个代表这个类的java.lang.Class对象,作为方法区访问这些数据的接口

2、链接

1、验证

  • 验证主要是确保class文件的字节流中包含的信息符合当前虚拟机,保证被加载类的正确性,不 会危害虚拟机自身的安全
  • 主要包括4种验证:文件格式验证、元数据验证、字节码验证、符号引用验证

2、准备

  • 为类变量分配内存,并设置该类变量的默认初始值

    这里不包括final修饰的static,因为final(常量)在编译时就分配了,准备阶段会显示初始化

    这里不会为实例变量分配,因为类变量在方法区,而实例变量会随着对象一起分配到堆中

3、解析

解析主要是把常量池中的符号引用转换为直接引用的过程

解析动作分为四类:包括类或接口的解析、字段解析、类方法解析、接口方法解析

3、初始化

  • 初始化阶段就是执行类构造器方法( )的过程

  • 此方法不需要定义,是javac编译器自动收集类变量和静态代码块

  • ()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的,编译器收集的顺序由语句在源文件中出现的顺序所决定

  • 若该类具有父类,则JVM会保证在执行子类的()前,父类的()已经执行完毕

  • 虚拟机会保证一个类的()方法在多线程环境中被正确地加锁和同步
    类加载的过程