classloader 和class.forname的區別
項目中,發生了classcast異常,源碼處寫的是Thread.currentThread
.getContextClassLoader
后來改成class.forname后OK啦
Class.forName(String clz);
使用調用這個語句的對象所使用的ClassLoader作為ClassLoader(1)。
Thread.currentThread().getContextClassLoader())
返回當前線程使用的ClassLoader(2)。
如果ClassLoader(1)“等于”ClassLoader(2),那么這里的使用Class.forName(String clz)和ClassLoader(2).loadClass(String clz)就是等價的。
如果ClassLoader(1)“不等于”ClassLoader(2),那么就是不等價的。
在框架代碼中,實際情況是ClassLoader(1)往往“不等于”ClassLoader(2):
即調用Class.forName(String clz)的語句所在的類的裝載器不一定就是當前線程使用的類裝載器。
因為:一個類裝載完了在運行了,該類的所屬的類裝載器就確定了(不變),而在程序運行之中,線程
的類裝載器都隨時可以通過hread.currentThread().setContextClassLoader(loader)進行改變(變)。
程序中出現的錯誤,可能是由于平臺的classloader是另一套機制