ClassLoader--jdk版本引起的ClassCastEx

2020-02-26  本文已影响0人  hekirakuno
ClassCastException

今天鸽鸽说,他想学学java,我说好的好的,快学快学(说着我打开了js,对于互抢饭碗的行为没有丝毫羞涩)。
然后鸽鸽说:“俺遇到了问题!俺按照教程写下来的,明明!为什么!为什么我就是一个Exception!”
我说:“莫急莫急,咱们一步一步分析哈。”

于是我打开了我的vscode(为什么不用idea?为了环境一致啊~),然后直接把代码拷贝进来,稍微修改了下格式,run!
咦?
貌似是ok的呢。


我的执行结果

然后,我发现了华点。请仔细看,我的mainloader是
sun.misc.Launcher$AppClassLoader

而鸽鸽呢?
它是:
jdk.internal.loader.ClassLoader$AppClassLoader
哦,不能相互转换的原因,找到了!

对于一个类,如果类加载器不同,那么都是不能划等号的。何况是两个类直接的类型转换。

java的类加载器因为一直秉行着双亲委派机制,所以,对于java基础包中的加载器结构限制十分严重。一旦有重大调整,那么势必不同版本之间,因为类加载器的不同,会造成很多问题。

我稍后便询问了鸽鸽的jdk版本。不出所料,是大神们先驱们的标配——最新版本——jdk13!
然而jdk9之后,应用程序和扩展类都不再是 java.net.URLClassLoader 的实例,因此必然失败。转换版本到1.8就可以解决了。

END。

上一篇 下一篇

猜你喜欢

热点阅读