类加载



  • 计算机两级存储

    1. 内存:
      缺点:容量小(4G,8G),断电后内容丢失,价格贵
      优点:速度快,
    2. 磁盘:
      缺点:速度慢
      优点:容量大(1T,2T),断电内容不丢失,价格便宜因而我们编写的代码编译后产生的.class 在磁盘同时 CPU 速度快,而磁盘慢,从内存中读取数据,因而我们程序从磁盘加载到内存中

  • 类加载

    

  • 加载一次验证
public class ReflectDemo01 {
  public static void main(String[] args) throws
  ClassNotFoundException {
    //
    Class clazz1=Book.class;
    Class clazz2=Book.class;
    System.out.println(clazz1==clazz2);//true说明是一次,如果加载多次,多个像,就不同了
    Class clazz3= Class.forName("cn.edu.xcu.reflect.entity.Book");
    System.out.println(clazz3==clazz1);//true
  }
}
  • 加载顺序

    

  • 加载步骤详解

      

        1. 加载:类加载过程的一个阶段:通过一个类的完全限定查找此类字节码文件,并利用字节码文件创建一个 Class 对象
        2. 验证:目的在于确保 Class 文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。主要包括四种验证,文件格式验证,元数据验证,字节码        验证,符号引用验证。
        3. 准备:为类变量(即 static 修饰的字段变量)分配内存并且设置该类变量的初始值即 0(如static int i=5;这里只将 i 初始化为 0,至于 5 的值将在初始化时赋值),这        里不包含用 final修饰的 static,因为 final 在编译的时候就会分配了,注意这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一        起分配到 Java 堆中。
        4. 解析:主要将常量池中的符号引用替换为直接引用的过程。符号引用就是一组符号来描述目标,可以是任何字面量,而直接引用就是直接指向目标的指针、相对        偏移量或一个间接定位到目标的句柄。有类或接口的解析,字段解析,类方法解析,接口方法解析(这里涉及到字节码变量的引用,如需更详细了解,可参考《深入         java 虚拟机》)。
        5. 初始化:类加载最后阶段,若该类具有超类,则对其进行初始化,执行静态初始化器和静态初始化成员变量(如前面只初始化了默认值的 static 变量将会在这个        阶段赋值,成员变量也将被初始化)



原文地址:https://www.cnblogs.com/yuanshuai1026/p/11580795.html