什么是类的加载
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口
加载步骤
包含了加载、验证、准备、解析和初始化这 5 个阶段。
加载
加载阶段的目的是将类的.class文件加载到JVM中,加载过程会创建一个java.lang.Class类的实例来表示这个类。这个Class对象作为程序中每个类的数据访问入口。
验证
校验类的正确性(文件格式,元数据,字节码,二进制兼容性),保证类的结构符合JVM规范
准备
为类变量分配内存并设置类变量的默认初始值,这些变量使用的内存都在方法区中分配。
解析
把类的符号引用转为直接引用
初始化
初始化是类加载的最后一步,也是真正执行类中定义的 Java 程序代码(字节码),初始化阶段是执行类构造器,这里利用了一种懒加载的思想,所有Java虚拟机实现必须在每个类或接口被Java程序首次主动使用才初始化
初始化时机:
当遇到 new、 getstatic、putstatic或invokestatic 这4条字节码指令时;
使用 java.lang.reflect 包的方法对类进行反射调用时,如果类没初始化,需要触发其初始化;
初始化一个类,如果其父类还未初始化,则先触发该父类的初始化
当虚拟机启动时,用户需要定义一个要执行的主类 (包含 main 方法的那个类),虚拟机会先初始化这个类