在JVM中,一个类从被加载到卸载需要经过如下阶段:
- 加载
- 验证、准备、解析
- 初始化
- 使用
- 卸载
其中,上面第2点的三个阶段统称为连接阶段。
那么类是在什么时候初始化的呢?
Java虚拟机规范是这样规定的:所有的虚拟机实现必须在类首次主动使用时才初始化它们。
于是问题又来了,哪种行为才是主动使用呢? 这样就来到了我们的正题:类主动使用的5种情况。这里提一句,除了这5种情况,其他的全部都是被动使用。
类主动使用的5种情况如下:
- 遇到new、getstatic、putstatic、invokestatic 这几个字节码指令,类没有初始化就会被初始化。对应的java场景为:我们使用new关键字创建对象、设置和读取类的静态属性、调用类的静态方法。
- 使用java.lang.reflect包的方法对类进行反射调用
- 当程序启动时,用户指定执行的主类
- 当一个类被初始化时,若其父类没有初始化,那么父类就会被初始化
- JDK1.7的动态语言支持(不常用)