不就是类加载

最近在看《深入理解java虚拟机》这本书,看到类加载这章时,感觉之前对类加载的理解还不是很深,尤其是双亲委派模型,这里总结下自己对这个模型的理解。

双亲委派模型

image.png

借用一下类加载中的双亲委派模型图。
从java虚拟机的角度,存在三种系统提供的类加载器。

  1. 引导类加载器(Bootstrap Classloader)
    负责加载\lib目录中的类库到虚拟机内存中。
  2. 扩展类加载器(Extension Classloader)
    负责加载\lib\ext 目录中的类库到虚拟机内存中。
  3. 系统类加载器(Application Classloader)
    负责加载用户类路径上所指定的类库,可以直接使用这个类加载器,也可自定义自己的类加载器。
    双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,只有当父类加载器无法完成加载时,子加载器才会尝试自己去加载。
    首先,以ClassA这个用户自定义类为例说明整个加载过程,假如开发人员自定义了一个类加载器A用来加载ClassA,类加载器A加载这个类时,首先判断这个类是否已经被加载,然后通知类加载A的父类系统类加载器去加载,系统类加载器也是重复这个过程,通过这个过程,保证在一个类加载器中,同一个类不会被重复加载。
    另外,如果用户自己编写了一个java.lang.Object的类,利用双亲委派模型的话,就能保证Object类的加载最终都会委派给处于模型最顶端的启动类加载器进行加载,保证java最基础的行为,避免应用程序变得一片混乱。
    最后,要注意一点的是,Java 虚拟机是如何判定两个 Java 类是相同的。Java 虚拟机不仅要看类的全名是否相同,还要看加载此类的类加载器是否一样。只有两者都相同的情况,才认为两个类是相同的。即便是同样的字节代码,被不同的类加载器加载之后所得到的类,也是不同的。

你可能感兴趣的:(不就是类加载)