类加载机制,双亲委派模型及其优点

JVM把描述类的数据从class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是JVM的类加载机制。

在加载阶段虚拟机需要完成以下三件事:

1通过一个类的全限定名称来获取此类的二进制字节流,并加载到内存中(需要使用类加载器)

2将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

3在堆中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口(所以反射通过类对象可以访问到字段)

类加载机制为双亲委派模型,具体步骤如下:

如果一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器去完成。

每一层的类加载器都把类加载请求委派给父类加载器,依次向上,直到所有的类加载请求都传递给顶层的启动类加载器。

如果顶层的启动类加载器无法完成加载请求,子类加载器才会尝试自己去加载该类,如果连最初发起类加载请求的类加载器也无法完成加载请求时,将会抛出ClassNotFoundException,而不再调用其子类加载器去进行类加载。

双亲委派模式的类加载机制的优点:

不同层次的类加载器具有不同优先级,比如所有Java对象的超级父类java.lang.Object,位于rt.jar,无论哪个类加载器加载该类,最终都是由启动类加载器进行加载,保证安全。即使用户自己编写一个java.lang.Object类并放入程序中,虽能正常编译,但不会被加载运行,因为Java中的java.lang.Object类是由启动类加载器进行加载,自己编写的java.lang.Object不会被启动类加载器进行加载保证不会出现混乱。相反,如果没有双亲委派模型而是由各个类加载器自行加载的话,如果用户编写了一个java.lang.Object的同名类并放在ClassPath中,那系统中将会出现多个不同的Object类,程序将混乱。

posted @ 2020-04-26 22:15  北城cheng  阅读(1364)  评论(0编辑  收藏  举报