类的初始化和实例化过程
类的初始化
类初始化时机
Java虚拟机规范中有且仅有5种情况必须立即对类进行初始化。
遇到new,getStatic,publicStatic和invokeStatic这四条指令的时候,要对类立即进行初始化。生成这四条指令的java代码
- 使用new关键字实例化对象的时候
- 读取或者设置一个类的静态字段
- 调用一个类的静态方法
使用java.lang.reflect包的方法对类进行反射的时候,如果类没有初始化,要对其进行初始化。
- 当初始化一个子类的时候,如果发现其父类没有初始化,要先对其父类进行初始化
- 当虚拟机启动的时候,用户需要指定一个要执行的主类
- 当使用JDk1.7动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果是REF_getstatic, REF_publicstatic和invokestatic的方法句柄,并且这个方法句柄没有被初始化的时候,要先对其进行初始化。