类虚拟机类加载机制(1)

一 类加载的注意点

                    以下部分也可以称为连接

首先类加载的过程: 加载  -------》验证-------》准备--------》解析---------》初始化----------》使用---------》卸载

声明一下 以下的 ”类型“ 代表的是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中”有且仅有“需要初始化的场景的第三种:当接口在初始化的过程中是,不需要父类接口全部完成初始化,当真正使到父类接口的时候才会初始化。

posted @ 2021-01-31 14:38  林鱼  阅读(47)  评论(0编辑  收藏  举报