
今天鴿鴿說(shuō),他想學(xué)學(xué)java,我說(shuō)好的好的,快學(xué)快學(xué)(說(shuō)著我打開(kāi)了js,對(duì)于互搶飯碗的行為沒(méi)有絲毫羞澀)。
然后鴿鴿說(shuō):“俺遇到了問(wèn)題!俺按照教程寫(xiě)下來(lái)的,明明!為什么!為什么我就是一個(gè)Exception!”
我說(shuō):“莫急莫急,咱們一步一步分析哈?!?/p>
于是我打開(kāi)了我的vscode(為什么不用idea?為了環(huán)境一致啊~),然后直接把代碼拷貝進(jìn)來(lái),稍微修改了下格式,run!
咦?
貌似是ok的呢。

然后,我發(fā)現(xiàn)了華點(diǎn)。請(qǐng)仔細(xì)看,我的mainloader是
sun.misc.Launcher$AppClassLoader
而鴿鴿呢?
它是:
jdk.internal.loader.ClassLoader$AppClassLoader
哦,不能相互轉(zhuǎn)換的原因,找到了!
對(duì)于一個(gè)類(lèi),如果類(lèi)加載器不同,那么都是不能劃等號(hào)的。何況是兩個(gè)類(lèi)直接的類(lèi)型轉(zhuǎn)換。
java的類(lèi)加載器因?yàn)橐恢北兄p親委派機(jī)制,所以,對(duì)于java基礎(chǔ)包中的加載器結(jié)構(gòu)限制十分嚴(yán)重。一旦有重大調(diào)整,那么勢(shì)必不同版本之間,因?yàn)轭?lèi)加載器的不同,會(huì)造成很多問(wèn)題。
我稍后便詢(xún)問(wèn)了鴿鴿的jdk版本。不出所料,是大神們先驅(qū)們的標(biāo)配——最新版本——jdk13!
然而jdk9之后,應(yīng)用程序和擴(kuò)展類(lèi)都不再是 java.net.URLClassLoader 的實(shí)例,因此必然失敗。轉(zhuǎn)換版本到1.8就可以解決了。
END。