java 的类加载,类加载器,和双亲委派模型

 

类加载器

java中,由该类本身和加载的它的类加载器 来确定 该类的唯一性,

即:如果一个类,由两种不同的类加载器加载,这两个类必定不相等。

bootStrap classLoader

extension classLoader

application classLoader

1.bootStrap 是启动类加载器,主要用来加载 %JAVAHOME%/lib下的类库

2.extension 是扩展类加载器,主要用来加载%JAVAHOME%/lib/ext目录下的类库

3.application 加载应用程序中的类,如我们程序员自己写的类默认 就是由它来加载的,

这3种类加载器是什么关系?是继承吗?

类加载器的父子关系不是以继承来实现的。而是以组合的关系来复用父加载器的代码

如何自定义自己的类加载器

答:继承抽象类java.lang.ClassLoader

什么是双亲委派模型?双亲委派模型有什么好处?为什么使用双亲委派模型?

一个类加载器收到加载类的请求时,把这个请求委派给父类去完成,因此所有的请求都应该传送到顶层的启动类加载器中。只有当父加载器无法完成这个请求时。

子类加载器才会自己去加载。

好处:类和加载它的类加载器一起具备了一种优先级的关系。即一些核心类只能由特定的类加载器加载。

如:java.lang.Object类只能由启动类加载器去加载,而其他类加载器不能加载,

有了双亲委派模型,自定义一个java.lang.Object,可以发现该类可以编译。但是永远不会被加载。运行时更会报错。因为 Java源码Object类已经先被加载了,其他的java.lang.Object类不会被承认。

如果没有双亲委派模型,那么java.lang.Object也可以由其他类加载器加载了。那程序就乱套了。

 

posted @ 2018-03-26 15:10  xie风细雨  阅读(71)  评论(0)    收藏  举报