java类加载机制

来源:互联网 发布:决战武林天罡进阶数据 编辑:程序博客网 时间:2024/06/08 10:55

        类加载机制是指将 .class 文件加载到 JVM,并形成 Class 对象机制,之后应用就可以对 Class 对象进行实例化并调用,类加载机制可在运行时动态加载外部类,远程加载网络下载来的 class 文件等。除了该动态化的优点外,还可通过 JVM 的类加载机制来达到类隔离的效果,例如 Application Server中通常要避免两个应用的类相互干扰。

        

JVM将类加载过程划分为下面几个步骤:

1. 装载(Load)

        装载过程负责找到二进制字节码并加载至 JVM 中,JVM 通过类的全限定名及类加载器(ClassLoader实例)完成交类的加载,同样,也采用以上两个元素来标识一个被加载的类:类的全限定名+ClassLoader实例ID。类名的命名方式如下:

        1) 对于接口或非数组型的类,其名称即为类名,此种类型的类由所在的 ClassLoader负责加载;

        2) 对于数组型的类,其名称为 “[”+(基本类型或L + 引用类型的类名;), 如 byte[] bytes = new byte[512],该byte的类名为:[B ; Object[] object = new Obejct[10], object的类名则为: [Ljava.lang.Obejct;,数组型类中的元素类型由所在 ClassLoader 负责加载,但数组类则由 JVM 直接创建。

(注:全限定名: java类包的定名,如:com.bluedavy.HelloWorld)


2.链接(Link)

        链接过程负责对二进制字节码的格式进行校验,初始化装载类中的静态变量及解析类中调用的接口,类。

        二进制字节码的格式校验遵循 Java Class File Format (具体请参见 JVM规范)规范,如果格式不符合,则抛出 VerifyError; 校验过程中如果碰到要引用的其他的接口和类,也会进行加载;如果加载过程失败,则会抛出 NoClassDefFoundError。

        在完成类校验后,JVM 初始化类中的静态变量,并将其值赋为默认值。

        最后对类中的所有属性,方法进行验证,以确保其要调用的属性,方法存在,以及具备相应的权限(例如 public,private 域权限等)。如果这个阶段失败,可能会造成 NoSuchMethodError,NoSuchFieldError等错误信息。


3.初始化(Initialize)

        初始化过程不是加载类时必触发的,但是最迟在初次主动使用对象前执行,其所作动作为给静态变量赋值,调用<cliinit>()等。

初始化过程即执行类中的静态初始化代码,构造器代码及静态属性的初始化,在以下四种情况下初始化过程会被执行:

        1)  调用了 new;

        2) 反射调用了类中的方法;

        3) 子类调用了初始化;

        4) JVM 启动过程中指定的初始化类。

        在执行初始化过程之前,首先必须完成链接过程中的校验和准备阶段,解析阶段则不强制。


   JVM 类加载通过 ClassLoader及其子类来完成,分为 Bootstrap ClassLoader,Extension ClassLoader,System ClassLoader 及 User-Defined ClassLoader。这4种 ClassLoader 的关系详细参见另一篇博客。  


原创粉丝点击