1. 程式人生 > >小白學JAVA《十九》--- 反射、類載入

小白學JAVA《十九》--- 反射、類載入

一、類載入 1.類載入器 1.1啟動類載入器(由C語言編寫) 負責載入存放在JDK\ire\lib下的等核心內庫 1.2拓展類載入器 1.3應用程式類載入器 1.4自定義類載入器 1.5內載入概念:將.java檔案編譯後的class位元組碼中的二進位制程式碼載入到記憶體中去的過程 2.類的生命週期 2.1載入 作用查詢並載入類的二進位制資料 2.11通過類的全限定名(包名加類名)來獲取其定義的二進位制位元組流 2.12將類中的所有靜態的儲存結構都轉化到方法區中去作為程式執行時所需要的資料結構,需要注意方法區也是堆,方法區放置更多的是和類相關的資料(類的程式碼,靜態域、靜態初始化塊、靜態方法、常量池(字串常量池)中間的東西 ) 2.13在JAVA堆中生成一個代表這個類的java.lang.class物件,作為對方法區中這些資料的訪問入口 2.14流程: .class----類載入器----堆(方法區(加入執行時的資料)(並new 一個class物件由方法區指向class物件)該物件是方法區中“執行時的資料結構”訪問入口) 2.2連線 2.21 驗證:確保被載入類的正確性 2.211檔案格式驗證 2.212 元資料驗證 2.213位元組碼嚴重 2.214 符號引用驗證 2.22準備 負責為類的靜態屬性分配記憶體,並將其基礎資料型別初始化為零,引用都是為null 2.23解析 把類中二進位制的符合引用全部替換為直接引用 2.3初始化 為類的變化 2.31宣告類變數是指定初始值 主動引用: 2.311建立類的例項 2.312訪問某個類或介面的靜態變數,或者對靜態變數賦值 2.313 呼叫類的靜態方法 2.314 反射 2.315初始化某個類的子類,則其父類也會被例項化 2.316啟動類的類,直接被初始化 2.317 以下情況將不會進行類 的初始化 2.3171 使用final修飾符的常量呼叫 2.3172通過陣列定義類的使用 2.3173通過子類去引用父類的靜態變數,子類不會初始化 2.32 為類的靜態變數賦初始值 2.33靜態常量在連線的準備階段就已經被賦初值了 2.4使用 2.5解除安裝 2.51 程式正常執行結束 2.52 程式在執行過程中遇到了異常或錯誤而異常終止 2.53由於作業系統出現錯誤而導致JAVA虛擬機器程序終止 2.54 執行了System.exit( )方法 2.6 類是有快取的 使用標準javaSE版本的類載入器載入的類一旦被載入完成,在一定時間內是有快取效果的。 2.7類載入器載入類的來源 2.71 本地檔案系統載入的.class檔案(我們自己寫的) ,絕大多數的載入都是這裡來的 2.72 從jar檔案中載入。class檔案,這種也是比較常見的 2.73 通過網路載入class檔案 2.74 動態載入一個JAVA原始檔,先編譯,後執行載入 3.JVM類載入機制 3.1 全盤負責 3.2父類委託(雙親委託機制),預設使用 3.3代理載入機制 當一個類載入器接收到一個類的載入請求的時候,讓其他的類載入器去幫助載入的過程,父類委託本身也是一種代理載入機制。不同的載入器,載入相同的類的時候,產生的類的Class物件不一定一樣。

二、反射 1.概念:在Java中,可以在執行期動態載入、探知和使用編譯期完全無法確定的類(Java在執行期去動態載入一個只知道“類的全限定名”的類,獲取其完整結構,還可以參照這個完整的資料結構,擁有建立類的例項,以及訪問類的屬性,訪問類的方法的能力。這種“看透”類的能力,被稱為反省、內省或自審) 一句話描述:執行時探究和使用編譯時未知的類 2.Class c=Class.forName( 類路徑 ) 3.反射的核心 Class類 4.怎樣得到class物件 4.1 如果一個類的例項已經存在,那麼我們可以使用 Person=new Person( ) class c=p.getclass( ); 4.2 如果在編譯期知道類,我們可以使用 Class c=person.class 4.3 如果連類名都不知道,但是在執行期可以執行,用 Class c=class.forname( “檔案路徑” )