为什么JVM的类加载要采用双亲委派的加载机制?
为什么JVM要采用双亲委派机制加载类呢?
任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。
也就是说,判断2个类是否“相等”,只有在这2个类是由同一个类加载器加载的前提下才有意义,否则即使这2个类来源于同一个Class文件,被同一个虚拟机加载,只要加载它们的类加载器不同,这2个类必定不相等。
基于双亲委派模型设计,那么Java中基础的类,Object类似Object类重复多次的问题就不会存在了,因为经过层层传递,加载请求最终都会被Bootstrap ClassLoader所响应。加载的Object类也会只有一个,否则如果用户自己编写了一个java.lang.Object类,并把它放到了ClassPath中,会出现很多个Object类,这样Java类型体系中最最基础的行为都无法保证,应用程序也将一片混乱。
双亲委派模型的好处:
1.主要是为了安全性,避免用户自己编写的类动态替换JAVA的一些核心类,比如String。
2.同时也避免了类的重复加载,因为JVM中区分不同类,不仅仅是根据类名,相同的class文件被不同的ClassLoader加载就是不同的两个类。
在JVM中表示两个class对象是否为同一个类对象存在两个必要条件:
1.类的完整类名必须一致,包括包名。
2.加载这个类的ClassLoader(指ClassLoader实例对象)必须相同。