1.ClassLoader(類加載器)
? ? ?1> ?java虛擬機與程序的生命周期
? ? ? ?在以下情況,程序?qū)⒔Y(jié)束生命周期
? ? ? (1)執(zhí)行了System.exit()方法
? ? ? (2)程序正常執(zhí)行完
? ? ? (3)程序在執(zhí)行過程中發(fā)生異潮つ担或者錯誤而異常終止
? ? ? (4)由于操作系統(tǒng)發(fā)生錯誤而導(dǎo)致java虛擬機進(jìn)程終止
? ? ?2>類的加載鳖宾、連接锈嫩、初始化
? ? ? ? ? 類的加載:查找并加載類的二進(jìn)制數(shù)據(jù)(將類的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中胁附,將其放在運行時數(shù)據(jù)區(qū)的方法內(nèi)榴啸,然后在堆區(qū)創(chuàng)建一個java.lang.Class對象呜象,用來封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu))
? ? ? ? ? 連接:(將已經(jīng)讀入到內(nèi)存中的類的二進(jìn)制數(shù)據(jù)合并到虛擬機的運行時環(huán)境中)
? ? ? ? ? ? ? ?-驗證(類文件的結(jié)構(gòu)檢查膳凝,語義檢查,字節(jié)碼驗證恭陡,二進(jìn)制兼容性的驗證):確保被加載類的正確性????
? ? ? ? ? ? ? ?-準(zhǔn)備:為類的靜態(tài)變量分配內(nèi)存蹬音,并將其初始化為默認(rèn)值
? ? ? ? ? ? ? -解析:把類中的符號引用轉(zhuǎn)換為直接引用
? ? ? ? ?初始化:為類的靜態(tài)變量賦予正確的初始值。
? ? ? 3>java程序?qū)︻惖氖褂梅绞接袃煞N:主動使用和被動使用(除去主動使用的都是被動使用)
所有的java虛擬機實現(xiàn)必須在每個類或接口被java程序“首次主動使用”時才初始化他們
主動使用(六種)
(1)創(chuàng)建類的實例
(2)訪問某個類或接口的靜態(tài)變量休玩,或者對該靜態(tài)變量賦值
(3)調(diào)用類的靜態(tài)方法
(4)反射
(5)初始化一個類的子類
(6)java 虛擬機啟動時被標(biāo)明為啟動類的類
4>加載.class文件的方式
從本地系統(tǒng)直接加載
通過網(wǎng)絡(luò)下載.class文件
從zip祟绊,jar等歸檔文件中加載.class文件
從專有數(shù)據(jù)庫中提取.class文件
將java源文件動態(tài)編譯為.class文件
5>類加載器的類型
? ? ? ?-java虛擬機自帶的加載器
? ? ? ? ? ? ? 根加載器(Bootstrap 由c++寫),擴展類加載器(Extension ?java編寫)哥捕,系統(tǒng)類加載器(System ?java編寫)
? ? ? -用戶自定義的加載器(java.lang.ClassLoader的子類)牧抽,用戶可以定制類的加載方式
6>類加載器不需要等到某個類被“首次主動使用”時再加載他。
(1)JVM規(guī)范允許類加載器在預(yù)料某個類將要被使用的時候就預(yù)先加載它遥赚,如果在加載的過程中遇到了
.class文件缺失或存在錯誤扬舒,類加載器必須在程序首次主動使用該類時才報錯(LinkageError錯誤)。
(2)如果這個類一直沒有主動程序使用它凫佛,那么類加載器就不會報告錯誤讲坎。
7>定義類加載器
? ? ? 如果某個類加載器能夠加載一個類,那么該類加載器就被稱為定義類加載 器愧薛。
? ? ? 定義類加載器及其所有子加載器都被稱為:初始類加載器
8>當(dāng)生成一個自定義的類加載器的實例時晨炕,若果沒有指定它的父加載器,那么系統(tǒng)類加載器將成為該類加載器的父加載器毫炉。
9>運行時包:由同一類加載器加載的屬于相同包的類組成 運行時包瓮栗。只有屬于同一運行時包的類
才能互相訪問包可見(默認(rèn)訪問級別)的類和類成員
10>在自定義類加載器的時候,我們必須重寫findClass()方法,然后要注意 要寫一個loadClassData()方法费奸,用于讀取class文件弥激,并將其轉(zhuǎn)換為二進(jìn)制數(shù)據(jù),然后在findClass()方法中調(diào)用defineClass()將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為Class的實例愿阐。具體代碼請看自定義類加載器詳情