一 类加载的注意点
以下部分也可以称为连接
首先类加载的过程: 加载 -------》验证-------》准备--------》解析---------》初始化----------》使用---------》卸载
声明一下 以下的 ”类型“ 代表的是class文件中代表Java语言的一个类或者接口的可能。
1 对于"加载"这个阶段 《Java虚拟机规范》没有规定什么什么时候加载,可以由JVM自行决定。
2 但是在初始化的过程中由6种情况必须立即要对类进行初始化。
1)当遇到new,getstatic,putstatic,invokestatic这四条指令,如果类型没有初始化,则需要进行初始化。以下的场景会生成以上的四条指令。
* 使用关键字实例化对象的时候。
* 读取或者设置一个静态化的字段。
* 调用一个静态的方法。
2)使用java.lang.reflect包的方法对类型进行反射调用的时候,如果类型没有进行过初始化,则需要进行初始化。
3)当初始化该类的时候,发现该类的父类没有进行初始化,则需要先对其父类进行初始化。
4)当虚拟机启动的时候,用户需要指定一个要执行的主类,虚拟机会先启动这个类。
5)当使用JDK7的动态语言支持的时候,最后解析为REF_getStatic,REF_putStatic,REF_invokeStatic,REF_newInvokeSpecial这四种方法句柄,如果这四种对应的类没有进行初始化,则先进行初始化。
6)当接口中定义JDK8新加入的默认方法,如果这接口的实现类发生了初始化,那该接口应该在其之前进行初始化。
最后
类的加载过程和接口的加载过程不同
其实接口也有加载的过程,而且在加载过程中编译器也会接口生成”<clinit>()“类构造器的。
而且最主要的是接口和类加载的不同在于这6中”有且仅有“需要初始化的场景的第三种:当接口在初始化的过程中是,不需要父类接口全部完成初始化,当真正使到父类接口的时候才会初始化。