类加载器加载类的过程

:类加载器在尝试自己去查找某个类的字节代码并定义它时,会先代理给其父类加载器,由父类加载器先去尝试加载这个类,依次类推。在介绍代理模式背后的动机之前,首先需要说明一下 Java 虚拟机是如何判定两个 Java 类是相同的。Java 虚拟机不仅要看类的全名是否相同,还要看加载此类的类加载器是否一样。只有两者都相同的情况,才认为两个类是相同的。即便是同样的字节代码,被不同的类加载器加载之后所得到的类,也是不同的。比如一个 Java 类 com.example.Sample,编译之后生成了字节代码文件 Sample.class。两个不同的类加载器 ClassLoaderAClassLoaderB分别读取了这个 Sample.class文件,并定义出两个 java.lang.Class类的实例来表示这个类。这两个实例是不相同的。对于 Java 虚拟机来说,它们是不同的类。试图对这两个类的对象进行相互赋值,会抛出运行时异常 ClassCastException

 

  因此注意,JVM识别两个Java类是否相同不仅仅是比较他们的字节码文件,这一点要注意了。。。

 

明白了这一点之后,就可以了解代理方式的设计动机了。代理方式是为了保证 Java 中心库的类型安全。一切 Java 使用都至少须要援用 java.lang.Object 类,也就是说在运转的时侯,java.lang.Object 这个类须要被加载到 Java 虚拟机中。假设这个加载流程由 Java 使用自己的类加载器来完成的话,很能够就存在多个版本的 java.lang.Object 类,并且这些类之间是不兼容的。议决代理方式,关于 Java 中心库的类的加载任务由引导类加载器来一致完成,保证了 Java 使用所运用的都是同一个版本的 Java 中心库的类,是互相兼容的。