什么是类加载器。
通过一个全限定名去找到一个类的二进制字节流。
一个类如果是通过不同的加载器去加载的话。得到的类是不想等的。
确定一个类的唯一性,要保证 类相同、类的加载器相同。
如下:
我们自己写的一个 classloder和 虚拟机自带的classloader。分别去加载 app这个类。
得到结果
class com.dongdao.App
false。
双亲委派模型。
java 中的 加载器可以分为 3 大类。
Bootstarp ClassLoader。启动类加载器。用来加载 \java_home\lib下的jar。
Extension ClassLoader 。 扩展类加载器。用来加载 \java_home\lib\ext。
Application Classloader 。 系统类加载器。我们程序中的clsaaLoader 就是用的这个加载器。跟我们开发最贴近。
为什么要用到双亲委派模型?
因为,上面我们讲到,确定一个类的唯一性要保证,类相同,加载器相同。
双亲委派模型的工作机制是: 一个类要被加载,必须先让其父类的加载器进行加载,如果加载失败,则才让子类加载。
假设,我们要加载 java.lang.Object,如果使用双亲机制,最终都是用bootstarpClassLoader 进行加载,因此object在虚拟机中是同一个类。相反,不使用双亲机制,使用不同的加载器去加载object,生成的object 也是不同的,java 体系的最基本行为都不能保证。