2012-03-15 85 views
3

經過谷歌我確實無法找到如何使用Thread.getContextClassLoader()的例子後,在哪裏我們會使用Thread.getContextClassLoader()和ClassLoader.getSystemClassLoader()就可以了嗎?

也許這個問題是重複的,如下 Difference between thread's context class loader and normal classloader

我的問題是如下概括: 據我所知使用Thread.getContextLoader的場景,包含在/lib/rt.jar中的JNDI核心類 但是那些JNDI Core(也許它們只是一些接口)沒有實現bean,在其他作品中如果你想使用JNDI的函數,你必須提供 JNDI的實現,然後我們將那些實現(可能是罐子)放入系統類路徑中, 但是現在覈心JDNI類是由Bootstrap加載的,而這些核心類必須使用它的實現類, 好吧,我們提供一個Thread.getContextClassLoader()(如果您沒有任何操作,則默認爲ClassLoader.getSystemClassLoader()),它可以加載那些現在, 我只是假設爲什麼核心JNDI類使用這種方式直接獲取systemClassLoader的ClassLoader.getSystemClassLoader()?

也許有些點我解釋不正確..

< 1>,但我只是想了解,如果我們可以用 ClassLoader.getSystemClassLoader()instand Thread.getClassLoader() 來裝載系統類路徑類或資源類 由bootstrap類加載器加載?

+0

使用'getContextClassLoader'你想讓你的程序弄得亂七八糟。 – 2012-03-15 14:37:08

回答

1

Thread.getContextClassLoader()被介紹給java不是從一開始。它在多類加載器環境中非常有用,對於在容器中運行的Java EE應用程序來說,通常爲每個企業應用程序分配私有類加載器。因此,使用上下文類加載器可以檢索與此應用程序一起打包的資源。

它也用於日誌系統的自我配置,如公用日誌記錄和log4j。

+0

是的,感謝您的及時評論,我已經重新命名了這個問題標題(也許我必須這樣做來澄清我的疑問),你能解釋爲什麼這些類(由bootstrap覆蓋)使用Thread.getContextClassLoader()作爲classLoader加載這些類放置在-classpath中,我認爲Thread.getContextClassLoader()的返回結果與ClassLoader.getSystemClassLoader()相同,但爲什麼我們無法用ClassLoader.getSystemClassLoader()替換contextCloadr來獲取資源,或許我們真的可以做到這一點? – user917879 2012-03-15 15:08:20

相關問題