Class loader priority is bootstrap >extension >application (or system)
1. bootstrap: 主要是負(fù)責(zé)裝載jre/lib下的jar文件,當(dāng)然,你也可以通過-Xbootclasspath參數(shù)定義。該ClassLoader不能被Java代碼實(shí)例化,因?yàn)樗荍VM本身的一部分
2. extension: 該ClassLoader是Bootstrap classLoader的子class
loader。它主要負(fù)責(zé)加載jre/lib/ext/下的所有jar文件。只要jar包放置這個(gè)位置,就會被虛擬機(jī)加載。一個(gè)常見的、類似的問題是,你
將mysql的低版本驅(qū)動不小心放置在這兒,但你的Web應(yīng)用程序的lib下有一個(gè)新的jdbc驅(qū)動,但怎么都報(bào)錯(cuò),譬如不支持JDBC2.0的
DataSource,這時(shí)你就要當(dāng)心你的新jdbc可能并沒有被加載。這就是ClassLoader的delegate現(xiàn)象。常見的有l(wèi)og4j、
common-log、dbcp會出現(xiàn)問題,因?yàn)樗鼈兒苋菀妆蝗巳竭@個(gè)ext目錄,或是Tomcat下的common/lib目錄。
3. application loader: 也稱為System
ClassLoaer。它負(fù)責(zé)加載CLASSPATH環(huán)境變量下的classes。缺省情況下,它是用戶創(chuàng)建的任何ClassLoader的父
ClassLoader,我們創(chuàng)建的standalone應(yīng)用的main
class缺省情況下也是由它加載(通過Thread.currentThread().getContextClassLoader()查看)。
我們實(shí)際開發(fā)中,用ClassLoader更多時(shí)候是用其加載classpath下的資源,特別是配置文件,如ClassLoader.getResource(),比FileInputStream直接。
ClassLoader是一種分級(hierarchy)的代理(delegation)模型。
Delegation:其實(shí)是Parent
Delegation,當(dāng)需要加載一個(gè)class時(shí),當(dāng)前線程的ClassLoader首先會將請求代理到其父classLoader,遞歸向上,如果該
class已經(jīng)被父classLoader加載,那么直接拿來用,譬如典型的ArrayList,它最終由Bootstrap
ClassLoader加載。并且,每個(gè)ClassLoader只有一個(gè)父ClassLoader。
Class查找的位置和順序依次是:Cache、parent、self。
Hierarchy:
上面的delegation已經(jīng)暗示了一種分級結(jié)構(gòu),同時(shí)它也說明:一個(gè)ClassLoader只能看到被它自己加載的
classes,或是看到其父(parent) ClassLoader或祖先(ancestor) ClassLoader加載的Classes。
在一個(gè)單虛擬機(jī)環(huán)境下,標(biāo)識一個(gè)類有兩個(gè)因素:class的全路徑名、該類的ClassLoader。
===================Tomcat Class Loading==========================================