classloader 和class.forname的區(qū)別
項(xiàng)目中,發(fā)生了classcast異常,源碼處寫的是Thread.currentThread
.getContextClassLoader
后來改成class.forname后OK啦
Class.forName(String clz);
使用調(diào)用這個(gè)語句的對(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)的語句所在的類的裝載器不一定就是當(dāng)前線程使用的類裝載器。
因?yàn)椋阂粋€(gè)類裝載完了在運(yùn)行了,該類的所屬的類裝載器就確定了(不變),而在程序運(yùn)行之中,線程
的類裝載器都隨時(shí)可以通過hread.currentThread().setContextClassLoader(loader)進(jìn)行改變(變)。
程序中出現(xiàn)的錯(cuò)誤,可能是由于平臺(tái)的classloader是另一套機(jī)制