2010-08-11 32 views
3

我不完全確定我是如何處理這種情況,但不知何故,我從Thread.getContextClassLoader獲得一個空的ClassLoader。在閱讀了一小段文檔(文檔和谷歌中沒有太多信息)後,我得到了一個印象,即當前線程有一個空類加載器,並且應該檢查getContextClassLoader對空引用的檢查。線程上下文類加載器可以爲空嗎?

這是非常令人驚訝的,因爲我已經看到一些開源項目未經檢查調用getContextClassLoader(這讓我首先檢查了這一點)。具體而言,該行codemodelJCodeModel.java line 358

(我只是驗證了log4j的不檢查爲好)

所以應該調用getContextClassLoader檢查空引用或東西弄亂了我的線程?

回答

3

這是相當有效的Thread.getContextClassLoader返回null。並非所有軟件的質量都特別好。

雖然nullClassLoader通常是指引導類加載器加載的系統類(我認爲這是正確的 - 術語搞砸由於歷史原因),線程上下文類加載器它通常被解釋爲未設置,系統而是使用類加載器。

IIRC,如果使用java命令,則線程上下文類加載器將設置爲主線程的系統類加載器。對於小應用程序,applet線程和EDT將它設置爲applet類加載器。

我會建議不要使用線程上下文類加載器(或大多數其他線程本地),除非上下文需要它。

+0

您是否碰巧知道當本機線程連接到JVM時上下文類加載器是否自動修復?我不確定我是如何得到上下文類加載器爲空的一點,因爲一切都在進行中,直到現在。 – 2010-08-11 14:19:39

+0

當創建一個'Thread'時,它繼承當前'Thread'的線程上下文類加載器。 – 2010-08-11 14:22:49

+0

這些是本地線程,而不是java線程。 – 2010-08-11 14:25:37

0

作爲Tom saysThread.getContextClassLoader()返回null是完全有效的。我隱約記得,默認行爲隨着時間的推移已經發生了變化(或者在各種JVM供應商實現中可能會有所不同 - 我不記得了)。

假設一個非空上下文ClassLoader可能是有效的,如果你已經進一步設置堆棧並且沒有外部代碼,或者如果類/庫合同需要一個。

作爲一個附註,Class.getClassLoader()也可以返回null