反射,類加載過程

首先理解RTTI:Run Time Type Identification ,運行時識別類型信息。

Class對象:它包含了與類有關的信息,事實上,Class對象就是用來創建類的所有的"常規"對象的。類是程序的一部分,每個類都有一個Class對象。換言之,每當編寫並且編譯了一個新類,就會產生一個Class對象(更恰當地說,是被保存在一個同名的.class文件中)。爲了生成這個類的對象,運行這個程序的Java虛擬機(JVM)將使用被稱爲"類加載器"的子系統。

所有類都是在對其第一次使用時,動態加載到JVM中。當程序創建第一個對類的靜態成員的引用時,就會加載這個類。這個證明構造器也是累的靜態方法,即使構造器之前沒有使用static關鍵字。因此,使用new操作符創建類的新對象也會被當做對類的靜態成員的引用。

因此,Java程序在它開始運行之前並非被完全加載,其各個部分是在必需時纔會加載的。

類加載器首先檢查這個類的Class對象是否已經加載。如果尚未加載,默認的類加載器就會根據類名查找.class文件。在這個類的字節碼被加載時,它們會接受驗證,保證其沒有被破壞,並且不包含不良Java代碼。

加載類的方法:Class.forName(String className).其中參數是全名,即包含包名。此時會去查找.class文件,然後JVM加載該類。如果找不到.class文件,就會報ClassNotFoundException.加載的過程當中,就會執行對應的靜態方法。

實際上加載類的過程:

1.加載,這是由類加載器執行的。該步驟將查找字節碼(通常在classpath所指定的路徑中查找,但這並非是必需的)。並從這些字節碼中創建一個Class對象。

2.鏈接,在鏈接階段將驗證類的字節碼,爲靜態域分配存儲空間。並且如果必需的話,將解析這個類創建的對其他類的所有引用。

3.初始化,如果該類具有超類(父類),則對其初始化,執行靜態初始化和靜態初始化塊。

  其中初始化被延遲了對靜態方法(構造器隱式地是靜態)或者非常數據靜態域進行首次引用時才執行:

 

obj.class得到一個Class對象。但是不會對該類進行初始化。

Class.newInstance()方法可以得到一個Class對象,但要求是該類有默認的無參構造器。

反射:即可以在運行時加載類,讀取程序在編譯階段不能獲取類的信息。藉助Field,Class,Method等類來獲取。比如修改該類型的字段,構造方法,方法等。。。。即在運行時獲取類的信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章