虛擬機器將class檔案的資訊載入到記憶體,並對資料進行校驗,轉換解析和初始化,這就是類載入機制。
類從被載入到記憶體,到解除安裝出記憶體,需要經過幾個階段:
載入(通過類名獲取該類的位元組流),
驗證(驗證class位元組流),
準備(進行類變數記憶體分配,即static變數,如private static int a = 123,這個變數在準備階段的值為0,只有初始化以後,a = 123,
而private static final int b = 123 ,靜態常量在準備階段 就會為b 賦值123)
解析初始化
使用解除安裝
類的初始化被呼叫時機:
1 通過new 關鍵字初始化例項
2 呼叫類中的靜態變數,靜態方法
3 通過反射呼叫某個類
4 通過new關鍵字例項化時,如果有父類,則先初始化父類,再初始化子類
(通過子類呼叫父類中的靜態變數和方法,只會初始化父類,不會初始化子類)
5 虛擬機器啟動時,需要制定主類(包含main方法的類),如android中的activitythread
類載入機制: 雙親委派機制(因為雙親委派機制的存在,保證了系統的穩定,頂層classloader載入一些基礎類,如object類就是由頂層classloader載入,這樣避免了乙個類被多個classloader載入)
載入過程:
1) 檢測該類是否已被載入
// first, check if the class has already been loaded
class<?> c = findloadedclass(name);
2)嘗試載入,先有父類載入
if (c == null) else
} catch (classnotfoundexception e)
3) 父類載入失敗,有當前classloader載入
if (c == null)
}return c;
android中的pathclassloader和dexclassloader也遵循雙親委派機制 java類載入機制
載入類時,每個類載入器總是首先將家在任務交給父類載入器,若父類載入器載入不到,自己才去載入 bootstrap loader時最頂級的載入器,其父載入器為null test test new test 11j class testclass test.getclass classloader cla...
Java類載入機制
解析階段是虛擬機器將常量池內的符號引用替換為直接引用的過程。符號引用 symbolic reference 符號引用以一組符號來描述所引用的目標,符號引用可以是任何形式的字面量,符號引用與虛擬機器實現的記憶體布局無關,引用的目標並不一定已經在記憶體中。直接引用 direct reference 直接...
Java類載入機制
在虛擬機器的生命週期中乙個類只被載入一次。類載入的原則 延遲載入,能少載入就少載入,因為虛擬機器的空間是有限的。類載入的時機 1 第一次建立物件要載入類.2 呼叫靜態方法時要載入類,訪問靜態屬性時會載入類。3 載入子類時必定會先載入父類。4 建立物件引用不載入類.5 子類呼叫父類的靜態方法時 1 當...