Java类加载器和JVM如何识别两个Java类相同

类加载器加载类的过程

类加载器在尝试自己去查找某个类的字节代码并定义它时,会先代理给其父类加载器,由父类加载器先去尝试加载这个类,依次类推。在介绍代理模式背后的动机之前,首先需要说明一下 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 中心库的类,是互相兼容的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值