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也可以由其他类加载器加载了。那程序就乱套了。

浙公网安备 33010602011771号