内容简介:前段时间,同事写了一段涉及到从 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,由不同类加载器实例(别提实例了,类加载器的类都不同)加载出来的情况,因此,他们虽然名字一样,但是已经不是一个类了,所以不能强转成功了。
以上所述就是小编给大家介绍的《关于某个类不能强转为自己的类型的问题的记录》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- awk 将多行文件转为一行
- js 将线性数据转为树形
- 如何将 Canvas 绘制过程转为视频
- python中将list转为dict
- Unity Gamma校正转为线性空间
- golang如何将interface转为struct结构体
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。