</p> 1)遇到new,getstatic,putstatic,invokestatic四条指令的时候,对应的场景:使用new关键字,读取或设置一个类的静态字段(final静态字段除外),以及调用类的静态方法的时候。 . K9 v5 Q1 i C6 d8 E2 z1 D( l( J
2)使用reflect包的方法进行类的反射调用的时候。 : y3 a% j3 J5 f* D5 M
3)当初始化一个类的时候,如果他的父类没有初始化,则先要触发父类的初始化。(注意这里是父类,如果是父接口的话,是不会触发父接口初始化成员变量的操作的,除非子类有引用父接口的变量) ' v, }$ z$ p" z4 G
4)虚拟机启动时,虚拟机会首先加载用户指定的一个要执行的主类(包含main方法的)
9 M/ _; ?: v: R 注:以上称为主动引用。有些情况是不会触发类的加载和初始化的。如:通过子类引用父类的静态字段,不会触发子类初始化;通过数组定义来引用类,不会触发此类的初始化;调用常量不会触发定义常量的类的初始化。 4 |3 q9 S5 e! v0 }8 m, E7 Y; D
在确定了什么时候会触发加载操作后,再来看看加载过程主要做些什么:
# L) @! b5 ?/ g4 x0 r( h 1通过类的全限定名来获取定义此类的二进制字节流。这个过程涉及到类加载器的过程,将在后面具体在写。
( \3 r7 Y! l/ [! c( h0 q 2将这个字节流所代表的静态存储结构转化为方法区中的运行时数据结构。方法区的数据结构每个虚拟机实现都可以不一样。 {0 P+ ~+ I" z" _
3在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的外部访问入口。
) N7 S4 n8 P/ I3 i 第一步到此就完成了。后面会继续介绍第二阶段验证。 $ Y# A: g; E4 `. T' I8 Q
软件设计师Java 虚拟机类加载机制,个人觉得要弄清楚,可以从如下两个方面去了解:
, h! ~* L& m1 u/ B( c( O 1.什么是类加载机制及虚拟机加载类的时机。 8 _, F! J) s) N
2.加载过程。
8 d: K$ L$ P' Y3 t$ N 首先看看第一个:虚拟机把描述类的数据从class文件加载到内存,并对class文件的合法性进行验证,引用转换及解析,最终形成可以被虚拟机使用的Java 类型,这就是虚拟机的类加载机制。 ' \; j a+ \) }/ J% o
由于java的动态扩展特点(就是可以在运行期指定具体类型),所以java的类加载过程都是在程序运行期完成。 8 Z5 n% K0 J& L, G/ J* v
2.虚拟机整个的加载过程可以分为7个阶段:加载-》验证-》准备-》解析-》初始化-》使用-》卸载。
6 E. e1 {/ j8 I. I8 m4 q0 [ 1.加载,这个过程虚拟机并没有明确规定何时进行,但是规定了只有以下四种情况必须立即进行加载。 ; M2 _" p8 Y. l: s/ b
1)遇到new,getstatic,putstatic,invokestatic四条指令的时候,对应的场景:使用new关键字,读取或设置一个类的静态字段(final 静态字段除外),以及调用类的静态方法的时候。
4 I4 E. t/ ^) C 2)使用reflect包的方法进行类的反射调用的时候。
5 S5 d9 G6 a- E0 {# j 3)当初始化一个类的时候,如果他的父类没有初始化,则先要触发父类的初始化。(注意这里是父类,如果是父接口的话,是不会触发父接口初始化成员变量的操作的,除非子类有引用父接口的变量) , _! S! Q& a9 g
4)虚拟机启动时,虚拟机会首先加载用户指定的一个要执行的主类(包含main方法的) 5 N% U" `4 y+ X/ |) X: f8 {
注:以上称为主动引用。有些情况是不会触发类的加载和初始化的。如:通过子类引用父类的静态字段,不会触发子类初始化;通过数组定义来引用类,不会触发此类的初始化;调用常量不会触发定义常量的类的初始化。 " Z& l3 h8 }: l0 N0 {7 h& G
在确定了什么时候会触发加载操作后,再来看看加载过程主要做些什么:
) V+ y& O2 k; z# ^& X9 j 1通过类的全限定名来获取定义此类的二进制字节流。这个过程涉及到类加载器的过程,将在后面具体在写。
! U5 G- x: G% F( L' [. T 2 将这个字节流所代表的静态存储结构转化为方法区中的运行时数据结构。方法区的数据结构每个虚拟机实现都可以不一样。 & z6 t, H( p) p& W$ T4 f) M
3 在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的外部访问入口。
8 X3 _, ]3 k# V1 P$ q- E4 I 第一步到此就完成了。后面会继续介绍第二阶段验证。 |