关于某个类不能强转为自己的类型的问题的记录

栏目: Java · 发布时间: 5年前

内容简介:前段时间,同事写了一段涉及到从 memcached 里拿出来值,并强转为某一类型的逻辑,结果出现了类不能强转为自己类型的异常,很有意思,记录一下。在 memcached 中,存储的是 TypeA 经过 Java 标准序列化后的内容,取值时返回的是 Object,需要强转为 TypeA。本来很简单的逻辑,但是出现异常了,异常爆出 TypeA 不能转为 TypeA,我们俩再三确认了一下,类名没有写错。后来,我想到以前我看过的一本书上(忘了从哪本书看的了)说:Java 中,判断两个类型是否相同需要:1.两个类有

前段时间,同事写了一段涉及到从 memcached 里拿出来值,并强转为某一类型的逻辑,结果出现了类不能强转为自己类型的异常,很有意思,记录一下。

正文

在 memcached 中,存储的是 TypeA 经过 Java 标准序列化后的内容,取值时返回的是 Object,需要强转为 TypeA。本来很简单的逻辑,但是出现异常了,异常爆出 TypeA 不能转为 TypeA,我们俩再三确认了一下,类名没有写错。

后来,我想到以前我看过的一本书上(忘了从哪本书看的了)说:Java 中,判断两个类型是否相同需要:1.两个类有相同的限定名;2.两个类由同一类加载器实例加载。既然类限定名是没有问题的,那么只能说明要强转成的 TypeA 和从 memcached 中取回的 TypeA(Java 标准反序列化生成的实例的 class)不是由同一类加载器实例加载的。后来查了一下,果不其然,同事写的那段逻辑是用 spring-devtool 启动的,而 spring-devtool 自己实现了一个类加载器,这个类加载器默认加载所有自己写的 Java 代码编译出来的 .class (也就是非 .jar 中的 .class),加载要强转为的 TypeA 就是由他加载的。而 memcached 中取回 TypeA 这块的逻辑是在 .jar 中封包的,这部分是由 AppClassLoader 加载的。这样就造成了同样是 TypeA,由不同类加载器实例(别提实例了,类加载器的类都不同)加载出来的情况,因此,他们虽然名字一样,但是已经不是一个类了,所以不能强转成功了。


以上所述就是小编给大家介绍的《关于某个类不能强转为自己的类型的问题的记录》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

能量分析攻击

能量分析攻击

Stefan Mangard、Elisabeth Oswald、Thomas Popp / 科学出版社 / 2010-8 / 58.00元

《能量分析攻击》可以作为密码学、电子工程、信息安全等专业的教材,也可以供相关专业人员参考。能量分析攻击旨在通过分析密码设备的能量消耗这一物理特性来恢复设备内部的秘密信息,这种基于实现特性的密码分析对广泛应用的各类密码模块的实际安全性造成了严重威胁,《能量分析攻击》是关于能量分析攻击的综合性专著,系统阐述了能量分析攻击的基本原理、技术方法以及防御对策的设计与分析。一起来看看 《能量分析攻击》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

html转js在线工具
html转js在线工具

html转js在线工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具