classloader
classloader 和class.forname的區(qū)別
項(xiàng)目中,發(fā)生了classcast異常,源碼處寫(xiě)的是Thread.currentThread.getContextClassLoader
后來(lái)改成class.forname后OK啦
項(xiàng)目中,發(fā)生了classcast異常,源碼處寫(xiě)的是Thread.currentThread.getContextClassLoader
后來(lái)改成class.forname后OK啦
Class.forName(String clz);
使用調(diào)用這個(gè)語(yǔ)句的對(duì)象所使用的ClassLoader作為ClassLoader(1)。
Thread.currentThread().getContextClassLoader())
返回當(dāng)前線程使用的ClassLoader(2)。
如果ClassLoader(1)“等于”ClassLoader(2),那么這里的使用Class.forName(String clz)和ClassLoader(2).loadClass(String clz)就是等價(jià)的。
如果ClassLoader(1)“不等于”ClassLoader(2),那么就是不等價(jià)的。
在框架代碼中,實(shí)際情況是ClassLoader(1)往往“不等于”ClassLoader(2):
即調(diào)用Class.forName(String clz)的語(yǔ)句所在的類(lèi)的裝載器不一定就是當(dāng)前線程使用的類(lèi)裝載器。
因?yàn)椋阂粋€(gè)類(lèi)裝載完了在運(yùn)行了,該類(lèi)的所屬的類(lèi)裝載器就確定了(不變),而在程序運(yùn)行之中,線程
的類(lèi)裝載器都隨時(shí)可以通過(guò)hread.currentThread().setContextClassLoader(loader)進(jìn)行改變(變)。
程序中出現(xiàn)的錯(cuò)誤,可能是由于平臺(tái)的classloader是另一套機(jī)制使用調(diào)用這個(gè)語(yǔ)句的對(duì)象所使用的ClassLoader作為ClassLoader(1)。
Thread.currentThread().getContextClassLoader())
返回當(dāng)前線程使用的ClassLoader(2)。
如果ClassLoader(1)“等于”ClassLoader(2),那么這里的使用Class.forName(String clz)和ClassLoader(2).loadClass(String clz)就是等價(jià)的。
如果ClassLoader(1)“不等于”ClassLoader(2),那么就是不等價(jià)的。
在框架代碼中,實(shí)際情況是ClassLoader(1)往往“不等于”ClassLoader(2):
即調(diào)用Class.forName(String clz)的語(yǔ)句所在的類(lèi)的裝載器不一定就是當(dāng)前線程使用的類(lèi)裝載器。
因?yàn)椋阂粋€(gè)類(lèi)裝載完了在運(yùn)行了,該類(lèi)的所屬的類(lèi)裝載器就確定了(不變),而在程序運(yùn)行之中,線程
的類(lèi)裝載器都隨時(shí)可以通過(guò)hread.currentThread().setContextClassLoader(loader)進(jìn)行改變(變)。
posted on 2008-03-23 00:19 Jhonney 閱讀(383) 評(píng)論(0) 編輯 收藏