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

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

内容简介:前段时间,同事写了一段涉及到从 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,由不同类加载器实例(别提实例了,类加载器的类都不同)加载出来的情况,因此,他们虽然名字一样,但是已经不是一个类了,所以不能强转成功了。


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

查看所有标签

猜你喜欢:

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

ES6标准入门(第3版)

ES6标准入门(第3版)

阮一峰 / 电子工业出版社 / 2017-9 / 99.00

ES6是下一代JavaScript语言标准的统称,每年6月发布一次修订版,迄今为止已经发布了3个版本,分别是ES2015、ES2016、ES2017。本书根据ES2017标准,详尽介绍了所有新增的语法,对基本概念、设计目的和用法进行了清晰的讲解,给出了大量简单易懂的示例。本书为中级难度,适合那些已经对JavaScript语言有一定了解的读者,可以作为学习这门语言最新进展的工具书,也可以作为参考手册......一起来看看 《ES6标准入门(第3版)》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

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

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具