JVM类加载机制
类加载机制有 加载-验证- 准备-解析- 初始化-使用-卸载 七个阶段 这些阶段都是交叉的混合进行的。通常在一个阶段执行的过程中调用,激活另一个阶段。
这里只讨论 加载 ,和初始化 这两个阶段。
类的初始化
5种情况必须对类进行初始化
1.new 实例化对象的时候,调用类的静态属性,静态方法的时候(被final 修饰的字段除外, 因为这个字段已经在编译期间放入class文件的常量池中了)
2.使用 java.lang.reflect 包的方法对类进行反射调用的时候。
3.当初始化一个类的时候。如果父类没有初始化,要先初始化父类。
4.当虚拟机启动时。用户需要指定一个要执行的主类(包含main方法的那个类),虚拟机会先初始化这个主类。
5.当使用jDK1.7的动态语言支持时。。。。。。()
不能对类进行初始化
1.子类调用父类的静态属性。只能初始化父类,不会导致子类初始化。
2. 调用final 修饰的常量。 不能进行类的初始化(常量在编译阶段存入调用类的常量池中。本质上并没有直接引用到定义常量的类,因此不会触发定义的常量的类的初始化)
3.通过数组定义来引用类, 不会触发此类的初始化。
类的加载
类是通过类的加载器来进行加载的。
java中通过加载类的类加载器 和 该类的本身 来确定类的唯一性。也就是说 比较两个类是否相等。 只有在这两个类是由同一个类加载器加载的前提下才有意义。
类加载器在类的层次划分,热部署,代码加密等领域大放异彩。
启动类加载器 (bootstrap ClassLoader) c++语言编写。是JVM的一部分,负责加载JAVA_HOME\lib目录下的类库加载到JVM中
扩展类加载器(Extension ClassLoader):这个加载器由 sun.misc.Launcher$ExtClassLoader实现。负责加载JAVA_HOME\lib\ext 目录下的类库加载到JVM中,
开发者可以直接使用这个类加载器
应用程序类加载器(Application ClassLoader)由于这个类加载器是ClassLoader中的 getSystemClassLoader() 方法返回的。也称为 系统类加载器,
负责加载用户类路径上所指定的类库,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

浙公网安备 33010602011771号