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