哪些網(wǎng)站比較容易做怎么做好市場宣傳和推廣
? ? ? ? 回顧了一下雙親委派機制,在這記錄記錄,下一篇會基于打破雙親委派機制來更新
1.? 類加載:
多個java文件經(jīng)過編譯打包后生成可運行jar包,最后啟動程序。首先需要通過類加載器把主類加載到JVM。主類在運行過程中如果使用到其他類,會逐步加載這些類。(jar包里的類不是一次性全部加載的,是使用到時才加載的)
?
類加載到使用過程步驟:
加載 >> 驗證 >> 準備 >> 解析 >> 初始化 >> 使用 >> 卸載
?
?? 加載:在硬盤上查找并通過IO讀入字節(jié)碼文件,使用到類時才會加載;
?? 驗證:校驗字節(jié)碼文件的正確性;
?? 準備:給類的靜態(tài)變量分配內(nèi)存,并賦予默認值;
?? 解析:將符號引用替換為直接引用,會把一些靜態(tài)方法替換為指向數(shù)據(jù)所存內(nèi)存的指針或句柄等(直接引用),這是靜態(tài)鏈接過程;動態(tài)鏈接是在程序運行期間完成的將符號引用替換為直接引用。
?? 初始化:對類的靜態(tài)變量初始化為指定的值,執(zhí)行靜態(tài)代碼塊。
?
?
?
2.類加載器和雙親委派機制
? 類加載器包括有:啟動類加載器,擴展類加載器,應(yīng)用類加載器,自定義類加載器
主要是:
? 啟動類加載器(bootstrap class loader):基于C++實現(xiàn),負責加載支撐JVM運行的位于JRE的lib目錄下的核心類庫,比如rt.jar等;
? 擴展類加載器(ExtClassLoader):負責加載支撐JVM運行的位于JRE的lib目錄下的ext擴展目錄中的JAR類包
? 應(yīng)用類加載器(AppClassLoader):負責加載ClassPath路徑下的類包,主要就是加載你自己寫的那些類
自定義加載器:負責加載用戶自定義路徑下的類包
?
自定義一個類加載器:
? ? ?自定義類加載器需要繼承java.lang.ClassLoader?類,這個類有兩個核心方法,一個是loadClass(String,boolean),實現(xiàn)了雙親委派機制,大概邏輯為:
?
1.?首先,檢查一下指定名稱的類是否已經(jīng)加載過,如果加載過了,就不需要再加載,直接返回。
2.?如果此類沒有加載過,那么,再判斷一下是否有父加載器;如果有父加載器,則由父加載器加載(即調(diào)用parent.loadClass(name,?false);).或者是調(diào)用bootstrap類加載器來加載。
3.?如果父加載器及bootstrap類加載器都沒有找到指定的類,那么調(diào)用當前類加載器的findClass方法來完成類加載。
?
還有一個方法是findClass,默認實現(xiàn)是拋出異常,所以自定義類加載器主要是重寫findClass()方法。
?
?
雙親委派機制:
?
JVM類加載器有親子層級結(jié)構(gòu):
?
雙親委派機制說簡單點就是,先找父親加載,不行再由兒子自己加載。
我在自己實驗過程中發(fā)現(xiàn),當我刪除classpath下編譯的類時,通過自定義類加載器加載我指定路徑的類文件,打印出為我自己的類加載器加載;當我將classpath下的該類復(fù)原時,再次打印類加載器時,返回的則是應(yīng)用類加載器了,說明雙親委派機制的加載層級關(guān)系。
?
為什么設(shè)計雙親委派機制呢?
- 沙箱安全機制:自己編寫的String類不會被加載,可以防止核心API庫被隨意篡改;
- 避免類的重復(fù)加載:當父類已經(jīng)加載了該類時,就沒有必要子類加載器再次加載一次,保證被加載類的唯一性。
?
打破雙親委派機制:
?
? 例如tomcat:在webapp下存在多個項目時,所加載的是單獨隔離的,每個webappClassLoader加載自己的目錄下的class文件,不會傳遞給父類加載器,打破了雙
親委派機制。
?
tomcat的幾個主要類加載器:
commonLoader:Tomcat最基本的類加載器,加載路徑中的class可以被Tomcat容器本身以及各個Webapp訪問;
catalinaLoader:Tomcat容器私有的類加載器,加載路徑中的class對于Webapp不可見;
sharedLoader:各個Webapp共享的類加載器,加載路徑中的class對于所有Webapp可見,但是對于Tomcat容器不可見;
WebappClassLoader:各個Webapp私有的類加載器,加載路徑中的class只對當前Webapp可見;
?
實現(xiàn)打破雙親委派機制,在原來重寫findClass基礎(chǔ)上,對于加載類loadClass方法進行重寫,取出雙親委派部分。
?