首頁 > 科技

百萬年薪大佬,一文全面解析Java反射及動態代理模式,網友:牛批

2021-06-05 16:57:31

一、反射概述

1、什麼是反射:

Reflection是被視為動態語言的關鍵,反射機制允許程式在執行期藉助於Reflection API獲得任何類的內部資訊,並能直接操作任意物件的內部屬性和方法。

載入完類之後,在堆記憶體的方法區中,就產生了一個class類型的物件(一個類只有一個Class物件),這個物件包含了完整的類的結構資訊。我們可以通過這個物件看到類的結構。這個物件就像一面鏡子,透過這個鏡子看到類的結構,所以,我們形象地稱之為:反射。

2、反射的使用方式:

3、什麼時候使用反射?

當需要動態創建物件的時候使用反射。

反射的特性:動態性。

4、反射和麵向物件中的封裝性是否矛盾?

不矛盾。舉個例子,比如一個類中提供了私有構造器,和一個返回該類例項的方法,可以通過暴露出的方法創建物件,如果非要使用構造器創建物件則需要用到反射。換句話說,不建議你用構造器創建,如果你非要用也不是不行,可以利用反射呼叫。

二、關於java.lang.Class的理解

1、類的載入過程

程式通過javac.exe命令以後,會生成一個或多個位元組碼檔案(.class結尾)。接著我們使用java.exe命令對某個位元組碼檔案進行解釋運行。相當於將某個位元組碼檔案載入到記憶體中。此過程就叫做類的載入。載入到記憶體中的類就稱為運行時類,此運行時類,就作為一個Class的一個例項。換句話說,Class的一個例項就對應著一個運行時類。

2、載入到記憶體中的運行時類,會快取一段時間。在此時間內,我們可以通過不同的方式來獲取來獲取此運行時類。

3、獲取Class的例項的方式

三、類的載入過程

1、載入:將class檔案位元組碼內容載入到記憶體中,並將這些靜態資料轉換成方法區的運行時資料結構,然後生成一個代表這個類的java.lang.Class物件,作為方法區中類資料的訪問入口(即引用地址)。所有需要訪問和使用類資料的操作只能通過這個Class物件。這個載入的過程需要類載入器參與。

2、連線:將Java類的二進位制程式碼合併到JVM的運行狀態中的過程。

2.1、驗證:確保載入的類資訊符合JVM規範。

2.2、準備:正式為類變數(static)分配記憶體並設定變數預設初始值的階段,這些記憶體都將在方法區進行分配。

2.3、解析:虛擬機器常量池內的符號引用(常量名)替換為直接引用(地址)的過程。

3、初始化;

3.1、執行類構造器<clinit>( )方法的過程。類構造器<clinit>( )方法是由編譯器自動收集類中所有變數的賦值動作和靜態程式碼塊中的語句合併產生的。(類構造器是構造類資訊的,而非構造該類物件的構造器)。

3.2、當初始化一個類的時候,如果發現其父類還沒有進行初始化,則需要先觸發其父類的初始化。

3.3、虛擬機器會保證一個類的<clinit>( )方法在多執行緒環境中被正確加鎖和同步。

四、類載入器的理解

1、類載入器的作用:將class檔案位元組碼內容載入到記憶體中,並將這些靜態資料轉換成方法區的運行時資料結構,然後在堆中生成一個代表這個類的java.lang.Class物件,作為方法區中類資料的訪問入口。

2、類快取:標準的JavaSE類載入器可以按要求查詢類,但一旦某個類被載入到類載入器中,它將維持載入(快取)一段時間。不過JVM垃圾回收機制可以回收這些Class物件。

3、JVM規範定義瞭如下類型的類的載入器

3.1、引導類載入器:用C++編寫的,是JVM自帶的類載入器,負責Java平臺核心庫,用來裝載核心類庫。該載入器無法直接獲取。

3.2、擴展類載入器:負責jre、lib、ext目錄下的jar包或者 -D java.ext.dirs指定目錄下的jar包裝入工作庫。

3.3、系統類載入器:負責 java -classpath 或D -java.class.path所指目錄下的類與jar包裝入工作,是最常用的載入器。

4、類載入器讀取配置檔案

五、通過反射創建對應的運行時類的物件

六、獲取運行時類的完整結構

七、呼叫運行時類的指定結構

八、反射的應用:動態代理

1、代理設計模式的原理:

使用一個代理將物件包裝起來,然後用該代理物件取代原始物件。任何對原始物件的呼叫都要通過代理。代理物件決定是否以及何時將方法呼叫轉到原始物件上。

2、靜態代理

3、動態代理


IT145.com E-mail:sddin#qq.com