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

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

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


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

查看所有标签

猜你喜欢:

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

Windows 程序设计:第5版

Windows 程序设计:第5版

CharlesPetzold / 北京博彦科技发展有限公司 / 北京大学出版社 / 2003-11-1 / 160.00元

Windows程序设计(第5版)对于Windows程序员来说,“从 Charles 的(Windows程序设计)一书中寻找答案。”几乎成了一句至理名言。而(Windows程序设计》第5版是专门为在Microsoft Windows 98、Microsoft Windows NT 4和 Windows NT 5下编程的开发人员编写的。内容博大精深,并有大量的源代码来帮助读者掌握Windows编程。本......一起来看看 《Windows 程序设计:第5版》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试