JAVA類加載器有三大類
- BootstarpClassLoder是頂級類加載器疟赊,默認加載%JAVA_HOME%中l(wèi)ib文件夾下的jar包和class文件弦追,在ExtClassLoader中使用parent字段指向該類,但沒有繼承關(guān)系;
- ExtClassLoder是擴展類加載器厢破,默認加載%JAVA_HOME%中l(wèi)ib文件夾下的jar包和class文件缝裁,在AppClassLoader中使用parent字段指向該類扫皱,但沒有繼承關(guān)系;
- AppClassLoader(應(yīng)用程序加載器/系統(tǒng)類加載器)是自定義加載器的父類捷绑,負責加載classPath下的類文件,引用的jar包以及自定義類都是這個加載器進行加載的韩脑,同時AppClassLoader還是線程上下文加載器,如果想實現(xiàn)一個自定義加載器的話就繼承(extends)ClassLoader來實現(xiàn).
類加載的流程
2.1. 向上委派
AppClassLoader是加載我們自己編寫的class類的,當他遇到一個新的class類的時候,不會直接進行加載,而是向上委派給ExtClassLoader,向上委派就是去查找ExtClassLoader是否緩存了這個class類粹污,如果有則返回段多,如果沒有則繼續(xù)委派給BootstrapClassLoader,如果BootstrapClassLoader中緩存有則加載返回.
2.2. 向下查找
開始進行向下查找了壮吩,就意味著當前class類向上委派到BootstrapClassLoader時還是沒有該類的緩存进苍,此時BootstrapClassLoader會查找加載自己路徑也就是%JAVA_HOME%/lib下的jar與class類文件,如果有則加載返回,沒有則繼續(xù)向下查找鸭叙。ExtClassLoader也是做同樣的操作觉啊。查找加載ExtClassLoader對應(yīng)路徑的文件,如果有則加載返回递雀,沒有則繼續(xù)向下到AppClassLoader查找加載柄延,AppClassLoader是加載classPath也就是我們程序員自己編寫的class類,如果AppClassLoader找不到則會拋出找不到class類異常
2.3. 流程簡介
向往委派是到頂層類加載器為止,向下查找是到發(fā)起的加載器為止搜吧,如果是有自定義類加載的情況市俊,發(fā)起和截至會是這個自定義加載器。
2.4. 作用
這樣做的原因主要是為了安全滤奈,避免程序員編寫類動態(tài)替換Java的核心類比如說String摆昧,同時也是避免了相同的class類被不同的ClassLoader重復(fù)加載