軟件設(shè)計(jì)師Java虛擬機(jī)類(lèi)加載機(jī)制,個(gè)人覺(jué)得要弄清楚,可以從如下兩個(gè)方面去了解:
1.什么是類(lèi)加載機(jī)制及虛擬機(jī)加載類(lèi)的時(shí)機(jī)。
2.加載過(guò)程。
首先看看第一個(gè):虛擬機(jī)把描述類(lèi)的數(shù)據(jù)從class文件加載到內(nèi)存,并對(duì)class文件的合法性進(jìn)行驗(yàn)證,引用轉(zhuǎn)換及解析,最終形成可以被虛擬機(jī)使用的Java類(lèi)型,這就是虛擬機(jī)的類(lèi)加載機(jī)制。
由于java的動(dòng)態(tài)擴(kuò)展特點(diǎn)(就是可以在運(yùn)行期指定具體類(lèi)型),所以java的類(lèi)加載過(guò)程都是在程序運(yùn)行期完成。
2.虛擬機(jī)整個(gè)的加載過(guò)程可以分為7個(gè)階段:加載-》驗(yàn)證-》準(zhǔn)備-》解析-》初始化-》使用-》卸載。
1.加載,這個(gè)過(guò)程虛擬機(jī)并沒(méi)有明確規(guī)定何時(shí)進(jìn)行,但是規(guī)定了只有以下四種情況必須立即進(jìn)行加載。
1)遇到new,getstatic,putstatic,invokestatic四條指令的時(shí)候,對(duì)應(yīng)的場(chǎng)景:使用new關(guān)鍵字,讀取或設(shè)置一個(gè)類(lèi)的靜態(tài)字段(final靜態(tài)字段除外),以及調(diào)用類(lèi)的靜態(tài)方法的時(shí)候。
2)使用reflect包的方法進(jìn)行類(lèi)的反射調(diào)用的時(shí)候。
3)當(dāng)初始化一個(gè)類(lèi)的時(shí)候,如果他的父類(lèi)沒(méi)有初始化,則先要觸發(fā)父類(lèi)的初始化。(注意這里是父類(lèi),如果是父接口的話(huà),是不會(huì)觸發(fā)父接口初始化成員變量的操作的,除非子類(lèi)有引用父接口的變量)
4)虛擬機(jī)啟動(dòng)時(shí),虛擬機(jī)會(huì)首先加載用戶(hù)指定的一個(gè)要執(zhí)行的主類(lèi)(包含main方法的)
注:以上稱(chēng)為主動(dòng)引用。有些情況是不會(huì)觸發(fā)類(lèi)的加載和初始化的。如:通過(guò)子類(lèi)引用父類(lèi)的靜態(tài)字段,不會(huì)觸發(fā)子類(lèi)初始化;通過(guò)數(shù)組定義來(lái)引用類(lèi),不會(huì)觸發(fā)此類(lèi)的初始化;調(diào)用常量不會(huì)觸發(fā)定義常量的類(lèi)的初始化。
在確定了什么時(shí)候會(huì)觸發(fā)加載操作后,再來(lái)看看加載過(guò)程主要做些什么:
1通過(guò)類(lèi)的全限定名來(lái)獲取定義此類(lèi)的二進(jìn)制字節(jié)流。這個(gè)過(guò)程涉及到類(lèi)加載器的過(guò)程,將在后面具體在寫(xiě)。
2將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)中的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。方法區(qū)的數(shù)據(jù)結(jié)構(gòu)每個(gè)虛擬機(jī)實(shí)現(xiàn)都可以不一樣。
3在java堆中生成一個(gè)代表這個(gè)類(lèi)的java.lang.Class對(duì)象,作為方法區(qū)這些數(shù)據(jù)的外部訪問(wèn)入口。
第一步到此就完成了。后面會(huì)繼續(xù)介紹第二階段驗(yàn)證。
軟件設(shè)計(jì)師Java虛擬機(jī)類(lèi)加載機(jī)制,個(gè)人覺(jué)得要弄清楚,可以從如下兩個(gè)方面去了解:
1.什么是類(lèi)加載機(jī)制及虛擬機(jī)加載類(lèi)的時(shí)機(jī)。
2.加載過(guò)程。
首先看看第一個(gè):虛擬機(jī)把描述類(lèi)的數(shù)據(jù)從class文件加載到內(nèi)存,并對(duì)class文件的合法性進(jìn)行驗(yàn)證,引用轉(zhuǎn)換及解析,最終形成可以被虛擬機(jī)使用的Java類(lèi)型,這就是虛擬機(jī)的類(lèi)加載機(jī)制。
由于java的動(dòng)態(tài)擴(kuò)展特點(diǎn)(就是可以在運(yùn)行期指定具體類(lèi)型),所以java的類(lèi)加載過(guò)程都是在程序運(yùn)行期完成。
2.虛擬機(jī)整個(gè)的加載過(guò)程可以分為7個(gè)階段:加載-》驗(yàn)證-》準(zhǔn)備-》解析-》初始化-》使用-》卸載。
1.加載,這個(gè)過(guò)程虛擬機(jī)并沒(méi)有明確規(guī)定何時(shí)進(jìn)行,但是規(guī)定了只有以下四種情況必須立即進(jìn)行加載。
1)遇到new,getstatic,putstatic,invokestatic四條指令的時(shí)候,對(duì)應(yīng)的場(chǎng)景:使用new關(guān)鍵字,讀取或設(shè)置一個(gè)類(lèi)的靜態(tài)字段(final靜態(tài)字段除外),以及調(diào)用類(lèi)的靜態(tài)方法的時(shí)候。
2)使用reflect包的方法進(jìn)行類(lèi)的反射調(diào)用的時(shí)候。
3)當(dāng)初始化一個(gè)類(lèi)的時(shí)候,如果他的父類(lèi)沒(méi)有初始化,則先要觸發(fā)父類(lèi)的初始化。(注意這里是父類(lèi),如果是父接口的話(huà),是不會(huì)觸發(fā)父接口初始化成員變量的操作的,除非子類(lèi)有引用父接口的變量)
4)虛擬機(jī)啟動(dòng)時(shí),虛擬機(jī)會(huì)首先加載用戶(hù)指定的一個(gè)要執(zhí)行的主類(lèi)(包含main方法的)
注:以上稱(chēng)為主動(dòng)引用。有些情況是不會(huì)觸發(fā)類(lèi)的加載和初始化的。如:通過(guò)子類(lèi)引用父類(lèi)的靜態(tài)字段,不會(huì)觸發(fā)子類(lèi)初始化;通過(guò)數(shù)組定義來(lái)引用類(lèi),不會(huì)觸發(fā)此類(lèi)的初始化;調(diào)用常量不會(huì)觸發(fā)定義常量的類(lèi)的初始化。
在確定了什么時(shí)候會(huì)觸發(fā)加載操作后,再來(lái)看看加載過(guò)程主要做些什么:
1通過(guò)類(lèi)的全限定名來(lái)獲取定義此類(lèi)的二進(jìn)制字節(jié)流。這個(gè)過(guò)程涉及到類(lèi)加載器的過(guò)程,將在后面具體在寫(xiě)。
2將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)中的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。方法區(qū)的數(shù)據(jù)結(jié)構(gòu)每個(gè)虛擬機(jī)實(shí)現(xiàn)都可以不一樣。
3在java堆中生成一個(gè)代表這個(gè)類(lèi)的java.lang.Class對(duì)象,作為方法區(qū)這些數(shù)據(jù)的外部訪問(wèn)入口。
第一步到此就完成了。后面會(huì)繼續(xù)介紹第二階段驗(yàn)證。
軟件設(shè)計(jì)師Java 虛擬機(jī)類(lèi)加載機(jī)制,個(gè)人覺(jué)得要弄清楚,可以從如下兩個(gè)方面去了解:
1.什么是類(lèi)加載機(jī)制及虛擬機(jī)加載類(lèi)的時(shí)機(jī)。
2.加載過(guò)程。
首先看看第一個(gè):虛擬機(jī)把描述類(lèi)的數(shù)據(jù)從class文件加載到內(nèi)存,并對(duì)class文件的合法性進(jìn)行驗(yàn)證,引用轉(zhuǎn)換及解析,最終形成可以被虛擬機(jī)使用的Java 類(lèi)型,這就是虛擬機(jī)的類(lèi)加載機(jī)制。
由于java的動(dòng)態(tài)擴(kuò)展特點(diǎn)(就是可以在運(yùn)行期指定具體類(lèi)型),所以java的類(lèi)加載過(guò)程都是在程序運(yùn)行期完成。
2.虛擬機(jī)整個(gè)的加載過(guò)程可以分為7個(gè)階段:加載-》驗(yàn)證-》準(zhǔn)備-》解析-》初始化-》使用-》卸載。
1.加載,這個(gè)過(guò)程虛擬機(jī)并沒(méi)有明確規(guī)定何時(shí)進(jìn)行,但是規(guī)定了只有以下四種情況必須立即進(jìn)行加載。
1)遇到new,getstatic,putstatic,invokestatic四條指令的時(shí)候,對(duì)應(yīng)的場(chǎng)景:使用new關(guān)鍵字,讀取或設(shè)置一個(gè)類(lèi)的靜態(tài)字段(final 靜態(tài)字段除外),以及調(diào)用類(lèi)的靜態(tài)方法的時(shí)候。
2)使用reflect包的方法進(jìn)行類(lèi)的反射調(diào)用的時(shí)候。
3)當(dāng)初始化一個(gè)類(lèi)的時(shí)候,如果他的父類(lèi)沒(méi)有初始化,則先要觸發(fā)父類(lèi)的初始化。(注意這里是父類(lèi),如果是父接口的話(huà),是不會(huì)觸發(fā)父接口初始化成員變量的操作的,除非子類(lèi)有引用父接口的變量)
4)虛擬機(jī)啟動(dòng)時(shí),虛擬機(jī)會(huì)首先加載用戶(hù)指定的一個(gè)要執(zhí)行的主類(lèi)(包含main方法的)
注:以上稱(chēng)為主動(dòng)引用。有些情況是不會(huì)觸發(fā)類(lèi)的加載和初始化的。如:通過(guò)子類(lèi)引用父類(lèi)的靜態(tài)字段,不會(huì)觸發(fā)子類(lèi)初始化;通過(guò)數(shù)組定義來(lái)引用類(lèi),不會(huì)觸發(fā)此類(lèi)的初始化;調(diào)用常量不會(huì)觸發(fā)定義常量的類(lèi)的初始化。
在確定了什么時(shí)候會(huì)觸發(fā)加載操作后,再來(lái)看看加載過(guò)程主要做些什么:
1通過(guò)類(lèi)的全限定名來(lái)獲取定義此類(lèi)的二進(jìn)制字節(jié)流。這個(gè)過(guò)程涉及到類(lèi)加載器的過(guò)程,將在后面具體在寫(xiě)。
2 將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)中的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。方法區(qū)的數(shù)據(jù)結(jié)構(gòu)每個(gè)虛擬機(jī)實(shí)現(xiàn)都可以不一樣。
3 在java堆中生成一個(gè)代表這個(gè)類(lèi)的java.lang.Class對(duì)象,作為方法區(qū)這些數(shù)據(jù)的外部訪問(wèn)入口。
第一步到此就完成了。后面會(huì)繼續(xù)介紹第二階段驗(yàn)證。
1.什么是類(lèi)加載機(jī)制及虛擬機(jī)加載類(lèi)的時(shí)機(jī)。
2.加載過(guò)程。
首先看看第一個(gè):虛擬機(jī)把描述類(lèi)的數(shù)據(jù)從class文件加載到內(nèi)存,并對(duì)class文件的合法性進(jìn)行驗(yàn)證,引用轉(zhuǎn)換及解析,最終形成可以被虛擬機(jī)使用的Java類(lèi)型,這就是虛擬機(jī)的類(lèi)加載機(jī)制。
由于java的動(dòng)態(tài)擴(kuò)展特點(diǎn)(就是可以在運(yùn)行期指定具體類(lèi)型),所以java的類(lèi)加載過(guò)程都是在程序運(yùn)行期完成。
2.虛擬機(jī)整個(gè)的加載過(guò)程可以分為7個(gè)階段:加載-》驗(yàn)證-》準(zhǔn)備-》解析-》初始化-》使用-》卸載。
1.加載,這個(gè)過(guò)程虛擬機(jī)并沒(méi)有明確規(guī)定何時(shí)進(jìn)行,但是規(guī)定了只有以下四種情況必須立即進(jìn)行加載。
1)遇到new,getstatic,putstatic,invokestatic四條指令的時(shí)候,對(duì)應(yīng)的場(chǎng)景:使用new關(guān)鍵字,讀取或設(shè)置一個(gè)類(lèi)的靜態(tài)字段(final靜態(tài)字段除外),以及調(diào)用類(lèi)的靜態(tài)方法的時(shí)候。
2)使用reflect包的方法進(jìn)行類(lèi)的反射調(diào)用的時(shí)候。
3)當(dāng)初始化一個(gè)類(lèi)的時(shí)候,如果他的父類(lèi)沒(méi)有初始化,則先要觸發(fā)父類(lèi)的初始化。(注意這里是父類(lèi),如果是父接口的話(huà),是不會(huì)觸發(fā)父接口初始化成員變量的操作的,除非子類(lèi)有引用父接口的變量)
4)虛擬機(jī)啟動(dòng)時(shí),虛擬機(jī)會(huì)首先加載用戶(hù)指定的一個(gè)要執(zhí)行的主類(lèi)(包含main方法的)
注:以上稱(chēng)為主動(dòng)引用。有些情況是不會(huì)觸發(fā)類(lèi)的加載和初始化的。如:通過(guò)子類(lèi)引用父類(lèi)的靜態(tài)字段,不會(huì)觸發(fā)子類(lèi)初始化;通過(guò)數(shù)組定義來(lái)引用類(lèi),不會(huì)觸發(fā)此類(lèi)的初始化;調(diào)用常量不會(huì)觸發(fā)定義常量的類(lèi)的初始化。
在確定了什么時(shí)候會(huì)觸發(fā)加載操作后,再來(lái)看看加載過(guò)程主要做些什么:
1通過(guò)類(lèi)的全限定名來(lái)獲取定義此類(lèi)的二進(jìn)制字節(jié)流。這個(gè)過(guò)程涉及到類(lèi)加載器的過(guò)程,將在后面具體在寫(xiě)。
2將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)中的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。方法區(qū)的數(shù)據(jù)結(jié)構(gòu)每個(gè)虛擬機(jī)實(shí)現(xiàn)都可以不一樣。
3在java堆中生成一個(gè)代表這個(gè)類(lèi)的java.lang.Class對(duì)象,作為方法區(qū)這些數(shù)據(jù)的外部訪問(wèn)入口。
第一步到此就完成了。后面會(huì)繼續(xù)介紹第二階段驗(yàn)證。
軟件設(shè)計(jì)師Java虛擬機(jī)類(lèi)加載機(jī)制,個(gè)人覺(jué)得要弄清楚,可以從如下兩個(gè)方面去了解:
1.什么是類(lèi)加載機(jī)制及虛擬機(jī)加載類(lèi)的時(shí)機(jī)。
2.加載過(guò)程。
首先看看第一個(gè):虛擬機(jī)把描述類(lèi)的數(shù)據(jù)從class文件加載到內(nèi)存,并對(duì)class文件的合法性進(jìn)行驗(yàn)證,引用轉(zhuǎn)換及解析,最終形成可以被虛擬機(jī)使用的Java類(lèi)型,這就是虛擬機(jī)的類(lèi)加載機(jī)制。
由于java的動(dòng)態(tài)擴(kuò)展特點(diǎn)(就是可以在運(yùn)行期指定具體類(lèi)型),所以java的類(lèi)加載過(guò)程都是在程序運(yùn)行期完成。
2.虛擬機(jī)整個(gè)的加載過(guò)程可以分為7個(gè)階段:加載-》驗(yàn)證-》準(zhǔn)備-》解析-》初始化-》使用-》卸載。
1.加載,這個(gè)過(guò)程虛擬機(jī)并沒(méi)有明確規(guī)定何時(shí)進(jìn)行,但是規(guī)定了只有以下四種情況必須立即進(jìn)行加載。
1)遇到new,getstatic,putstatic,invokestatic四條指令的時(shí)候,對(duì)應(yīng)的場(chǎng)景:使用new關(guān)鍵字,讀取或設(shè)置一個(gè)類(lèi)的靜態(tài)字段(final靜態(tài)字段除外),以及調(diào)用類(lèi)的靜態(tài)方法的時(shí)候。
2)使用reflect包的方法進(jìn)行類(lèi)的反射調(diào)用的時(shí)候。
3)當(dāng)初始化一個(gè)類(lèi)的時(shí)候,如果他的父類(lèi)沒(méi)有初始化,則先要觸發(fā)父類(lèi)的初始化。(注意這里是父類(lèi),如果是父接口的話(huà),是不會(huì)觸發(fā)父接口初始化成員變量的操作的,除非子類(lèi)有引用父接口的變量)
4)虛擬機(jī)啟動(dòng)時(shí),虛擬機(jī)會(huì)首先加載用戶(hù)指定的一個(gè)要執(zhí)行的主類(lèi)(包含main方法的)
注:以上稱(chēng)為主動(dòng)引用。有些情況是不會(huì)觸發(fā)類(lèi)的加載和初始化的。如:通過(guò)子類(lèi)引用父類(lèi)的靜態(tài)字段,不會(huì)觸發(fā)子類(lèi)初始化;通過(guò)數(shù)組定義來(lái)引用類(lèi),不會(huì)觸發(fā)此類(lèi)的初始化;調(diào)用常量不會(huì)觸發(fā)定義常量的類(lèi)的初始化。
在確定了什么時(shí)候會(huì)觸發(fā)加載操作后,再來(lái)看看加載過(guò)程主要做些什么:
1通過(guò)類(lèi)的全限定名來(lái)獲取定義此類(lèi)的二進(jìn)制字節(jié)流。這個(gè)過(guò)程涉及到類(lèi)加載器的過(guò)程,將在后面具體在寫(xiě)。
2將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)中的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。方法區(qū)的數(shù)據(jù)結(jié)構(gòu)每個(gè)虛擬機(jī)實(shí)現(xiàn)都可以不一樣。
3在java堆中生成一個(gè)代表這個(gè)類(lèi)的java.lang.Class對(duì)象,作為方法區(qū)這些數(shù)據(jù)的外部訪問(wèn)入口。
第一步到此就完成了。后面會(huì)繼續(xù)介紹第二階段驗(yàn)證。
軟件設(shè)計(jì)師Java 虛擬機(jī)類(lèi)加載機(jī)制,個(gè)人覺(jué)得要弄清楚,可以從如下兩個(gè)方面去了解:
1.什么是類(lèi)加載機(jī)制及虛擬機(jī)加載類(lèi)的時(shí)機(jī)。
2.加載過(guò)程。
首先看看第一個(gè):虛擬機(jī)把描述類(lèi)的數(shù)據(jù)從class文件加載到內(nèi)存,并對(duì)class文件的合法性進(jìn)行驗(yàn)證,引用轉(zhuǎn)換及解析,最終形成可以被虛擬機(jī)使用的Java 類(lèi)型,這就是虛擬機(jī)的類(lèi)加載機(jī)制。
由于java的動(dòng)態(tài)擴(kuò)展特點(diǎn)(就是可以在運(yùn)行期指定具體類(lèi)型),所以java的類(lèi)加載過(guò)程都是在程序運(yùn)行期完成。
2.虛擬機(jī)整個(gè)的加載過(guò)程可以分為7個(gè)階段:加載-》驗(yàn)證-》準(zhǔn)備-》解析-》初始化-》使用-》卸載。
1.加載,這個(gè)過(guò)程虛擬機(jī)并沒(méi)有明確規(guī)定何時(shí)進(jìn)行,但是規(guī)定了只有以下四種情況必須立即進(jìn)行加載。
1)遇到new,getstatic,putstatic,invokestatic四條指令的時(shí)候,對(duì)應(yīng)的場(chǎng)景:使用new關(guān)鍵字,讀取或設(shè)置一個(gè)類(lèi)的靜態(tài)字段(final 靜態(tài)字段除外),以及調(diào)用類(lèi)的靜態(tài)方法的時(shí)候。
2)使用reflect包的方法進(jìn)行類(lèi)的反射調(diào)用的時(shí)候。
3)當(dāng)初始化一個(gè)類(lèi)的時(shí)候,如果他的父類(lèi)沒(méi)有初始化,則先要觸發(fā)父類(lèi)的初始化。(注意這里是父類(lèi),如果是父接口的話(huà),是不會(huì)觸發(fā)父接口初始化成員變量的操作的,除非子類(lèi)有引用父接口的變量)
4)虛擬機(jī)啟動(dòng)時(shí),虛擬機(jī)會(huì)首先加載用戶(hù)指定的一個(gè)要執(zhí)行的主類(lèi)(包含main方法的)
注:以上稱(chēng)為主動(dòng)引用。有些情況是不會(huì)觸發(fā)類(lèi)的加載和初始化的。如:通過(guò)子類(lèi)引用父類(lèi)的靜態(tài)字段,不會(huì)觸發(fā)子類(lèi)初始化;通過(guò)數(shù)組定義來(lái)引用類(lèi),不會(huì)觸發(fā)此類(lèi)的初始化;調(diào)用常量不會(huì)觸發(fā)定義常量的類(lèi)的初始化。
在確定了什么時(shí)候會(huì)觸發(fā)加載操作后,再來(lái)看看加載過(guò)程主要做些什么:
1通過(guò)類(lèi)的全限定名來(lái)獲取定義此類(lèi)的二進(jìn)制字節(jié)流。這個(gè)過(guò)程涉及到類(lèi)加載器的過(guò)程,將在后面具體在寫(xiě)。
2 將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)中的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。方法區(qū)的數(shù)據(jù)結(jié)構(gòu)每個(gè)虛擬機(jī)實(shí)現(xiàn)都可以不一樣。
3 在java堆中生成一個(gè)代表這個(gè)類(lèi)的java.lang.Class對(duì)象,作為方法區(qū)這些數(shù)據(jù)的外部訪問(wèn)入口。
第一步到此就完成了。后面會(huì)繼續(xù)介紹第二階段驗(yàn)證。