为什么类加载器要使用双亲委派模式来设计?

为什么类加载器要使用双亲委派模式来设计?

    • 类与类加载器
    • 类加载器的类型
    • 类加载器和双亲委派模式的关系

类与类加载器

jvm中,确定一个类的唯一性是依赖于加载这个类的类加载器和这个类本身的。只有加载类的类加载器和类本身两者都一直,jvm才会认为这个类是唯一的。

类加载器的类型

从JVM层面来讲,有两种:
1、启动类加载器(Bootstrap ClassLoader)
该加载器由C++语言实现,属于JVM内部。
2、其他的类加载器
该类有java语言编写,属于JVM外部,全部继承于抽象类java.lang.ClassLoader

从JAVA角度来讲,有三种:
1、启动类加载器(Bootstrap ClassLoader)
这个和上面一致,不赘述。
2、扩展类加载器(Extension ClassLoader)
负责加载\lib\ext 目录中的,或者被java.ext.dirs系统变量所指定的路径下的类库。
3、应用程序加载器(Application ClassLoader)
该加载器是ClassLoader中的getSystemClassLoader()方法的返回值,一般也称为系统类加载器。
负责加载用户类路径CLASSPATH所指定的类库。

类加载器和双亲委派模式的关系

这里说道标题的重点了,为什么类加载器要采用双亲委派模式?
首先我们来看看如果不用双亲委派模式,会是什么结果。比如我们自己创建了一个java.lang.Object类,并且放在classpath下,然后启动程序,因为java本身会有个java.lang.Object类,然后会造成java本身的Object类由启动类加载器来加载,而我们自己创建的Object类会由应用程序类加载器类加载,然后根据我们前面提到的【一个类的唯一性由加载这个类的类加载器和这个类本身来确定】,那么现在这种情况,就会造成类的混乱。
而使用双亲委派模式的话,会进行限制,这种情况如果我们自己创建了一个java.lang.Object类,则会在运行时发生错误,限制了类混乱的问题。

你可能感兴趣的:(为什么类加载器要使用双亲委派模式来设计?)