JAVA類加載器有三大類
- BootstarpClassLoder是頂級(jí)類加載器,默認(rèn)加載%JAVA_HOME%中l(wèi)ib文件夾下的jar包和class文件,在ExtClassLoader中使用parent字段指向該類,但沒有繼承關(guān)系;
- ExtClassLoder是擴(kuò)展類加載器,默認(rèn)加載%JAVA_HOME%中l(wèi)ib文件夾下的jar包和class文件,在AppClassLoader中使用parent字段指向該類,但沒有繼承關(guān)系;
- AppClassLoader(應(yīng)用程序加載器/系統(tǒng)類加載器)是自定義加載器的父類,負(fù)責(zé)加載classPath下的類文件,引用的jar包以及自定義類都是這個(gè)加載器進(jìn)行加載的,同時(shí)AppClassLoader還是線程上下文加載器,如果想實(shí)現(xiàn)一個(gè)自定義加載器的話就繼承(extends)ClassLoader來(lái)實(shí)現(xiàn).
類加載的流程
2.1. 向上委派
AppClassLoader是加載我們自己編寫的class類的,當(dāng)他遇到一個(gè)新的class類的時(shí)候,不會(huì)直接進(jìn)行加載,而是向上委派給ExtClassLoader,向上委派就是去查找ExtClassLoader是否緩存了這個(gè)class類,如果有則返回,如果沒有則繼續(xù)委派給BootstrapClassLoader,如果BootstrapClassLoader中緩存有則加載返回.
2.2. 向下查找
開始進(jìn)行向下查找了,就意味著當(dāng)前class類向上委派到BootstrapClassLoader時(shí)還是沒有該類的緩存,此時(shí)BootstrapClassLoader會(huì)查找加載自己路徑也就是%JAVA_HOME%/lib下的jar與class類文件,如果有則加載返回,沒有則繼續(xù)向下查找。ExtClassLoader也是做同樣的操作。查找加載ExtClassLoader對(duì)應(yīng)路徑的文件,如果有則加載返回,沒有則繼續(xù)向下到AppClassLoader查找加載,AppClassLoader是加載classPath也就是我們程序員自己編寫的class類,如果AppClassLoader找不到則會(huì)拋出找不到class類異常
2.3. 流程簡(jiǎn)介
向往委派是到頂層類加載器為止,向下查找是到發(fā)起的加載器為止,如果是有自定義類加載的情況,發(fā)起和截至?xí)沁@個(gè)自定義加載器。
2.4. 作用
這樣做的原因主要是為了安全,避免程序員編寫類動(dòng)態(tài)替換Java的核心類比如說String,同時(shí)也是避免了相同的class類被不同的ClassLoader重復(fù)加載