什麼是類的加載
類的加載指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,而後在堆區建立一個java.lang.Class對象,用來封裝類在方法區內的數據結構。java
類的加載過程:
1)裝載(Load):查找並加載類的二進制數據安全
在加載階段,虛擬機須要完成如下三件事情:數據結構
(1)經過一個類的全限定名來獲取其定義的二進制字節流。ide
(2)將這個字節流所表明的靜態存儲結構轉化爲方法區的運行時數據結構。佈局
(3)在Java堆中生成一個表明這個類的java.lang.Class對象,做爲對方法區中這些數據的訪問入口。.net
2)連接(Link):指針
(1)驗證:確保被加載的類的正確性;對象
①做用:目的是確保Class文件的字節流中包含的信息符合當前虛擬機的要求,而且不會危害虛擬機自身的安全。blog
②驗證階段大體的檢驗動做:接口
文件格式驗證:驗證字節流是否符合Class文件格式的規範;
元數據驗證:對字節碼描述的信息進行語義分析(注意:對比javac編譯階段的語義分析),以保證其描述的信息符合Java語言規範的要求;
字節碼驗證:經過數據流和控制流分析,肯定程序語義是合法的、符合邏輯的。
符號引用驗證:確保解析動做能正確執行。
(2)準備:爲類的靜態變量分配內存,並將其初始化爲默認值。
準備階段是正式爲類變量分配內存並設置類變量初始值的階段,這些內存都將在方法區 中分配。
注意:
①這時候進行內存分配的僅包括類變量(static),而不包括實例變量,實例變量會在對象實 例化時隨着對象一塊分配在Java堆中。
②這裏所設置的初始值一般狀況下是數據類型默認的零值(如0、0L、null、false等),而不是被在Java代碼中被顯式地賦予的值。
(3)解析:把類中的符號引用轉換爲直接引用
解析階段是虛擬機將常量池內的符號引用替換爲直接引用的過程。 解析動做主要針對類或接口、字段、類方法、接口方法、方法類型、方法句柄和調用限定符7類符號引用進行。
符號引用:以一組符號來描述所引用的目標,符號能夠是任何形式的字面量,與VM實現的內存佈局無關,引用的目標並不必定已經加載到內存中。
直接引用:就是直接指向目標的指針、相對偏移量或一個間接定位到目標的句柄。
3)初始化(Initialize):對類的靜態變量,靜態代碼塊執行初始化操做
初始化,爲類的靜態變量賦予正確的初始值,JVM負責對類進行初始化,主要對類變量進行初始化。
對類變量進行初始值設定:
①聲明類變量是指定初始值。
②使用靜態代碼塊爲類變量指定初始值。
JVM初始化步驟:
(1)假如這個類尚未被加載和鏈接,則程序先加載並鏈接該類;
(2)假如該類的直接父類尚未被初始化,則先初始化其直接父類;
(3)假如類中有初始化語句,則系統依次執行這些初始化語句;
反射機制:
JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。
反射機制的常見做用:
1)動態的加載類、動態的獲取類的信息(屬性,方法,構造器).
(1)獲取類的名字:
①String getName() 得到包名+類名.
②String getSimpleName() 得到類的名字.
(2)得到類的屬性
①Field getField(String fieldName) 獲得公共的屬性對象.
②Field getDeclareField(String fieldName) 獲得指定名稱的屬性對象.
③Field []c.getDeclaredFields() 獲得全部的屬性對象.
(3)得到類的方法
①Method[] getDeclaredMethods() 獲得公共的方法對象.
②Method[] c.getMethods() 獲得父類及本類中的公共的方法對象.
③Method getDeclaredMethod(StringmethodName, Class …type)獲得指定名稱的本類中公共的方法.
④Method getMethod(String methodName,Class type)獲得本類或父類中的公共的方法對象.
(4)得到構造方法:
①Constructor[] getDeclaredConstructors() 獲得公共的構造方法的對象.
②Constructor [] getConstructors() 獲得公共的構造方法對象.
③Constructor getDeclaredConstructor(Class...type)獲得指定參數的公共的構造方法對象.
2)動態構造對象.
3)動態調用類和對象的任意方法、構造器.
4)動態調用和處理屬性.
5)獲取泛型信息.
6)處理註解.
常見的內容註解:
1.@Override :標識方法是重寫的方法
2.@Deprecated :標識的方法不建議使用
3.@SuppressWarnings:用來抑制編譯時的警告信息