关于Java类加载,主要弄清楚三个问题 :
为什么需要类加载
什么时候进行类加载
怎么进行类加载
一、为什么需要类加载
我们编写好的程序经过编译之后,会形成Class文件,Class文件描述了类的各种信息,而Java虚拟机想要运行程序,就必须把Class文件加载进入虚拟机内部,才能供其所用。
在JVM中,类的各种信息一般都存储在方法区中,所以需要将类信息加载进入方法区,才能在需要类信息时,比如实例化对象时找到对应的类信息。
二、什么时候进行类加载
一个类加载进内存一般需要经历 加载(Loading)→验证(Verification)→准备(Preparation)→解析(Resolution)→初始化(Initialization) 五个阶段,才能供程序调用。
什么时候开始加载阶段,《Java虚拟机规范》没有严格规定,但是存在有六种情况必须对立即对类立即进行初始化,而在初始化之前,必须进行加载、验证、和准备工作。为什么解析不是必须的,因为解析在某些情况下可以在初始化之后在开始,这和Java的动态绑定有关。
以下六种情况必须立即对类进行初始化:
1.遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,典型场景为:new实例化对象、读取或设置类的静态变量(final修饰的)、调用一个类的静态方法等。
2.使用java.lang.reflect包方法对类进行反射调用时
3.当初始化类的时候,发现其父类没有初始化,则先触发父类的初始化
4.当虚拟机启动时,主类(包含main()方法类)