程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java反射機制介紹

Java反射機制介紹

編輯:關於JAVA

Java反射機制介紹。本站提示廣大學習愛好者:(Java反射機制介紹)文章只能為提供參考,不一定能成為您想要的結果。以下是Java反射機制介紹正文


1. 文檔概述

Java反射是Java被視為動態(或准動態)語言的一個關鍵性質,Java反射機制容許程序在運行時加載、探知、使用編譯期間完全未知的classes。換言之,Java可以加載一個運行時才得知名稱的class,獲得其完整結構。

在工作過程中,常會聽到反射這個概念,在平常的代碼開發中也有看到和使用到,只是對它沒有一個較深入的了解,這次重新理解學習了一下反射機制,結合公司產品中的Hotweb框架,加深理解,本文為學習過程中的總結。

2. 目標讀者
  • 數通暢聯內部員工
  • 廣大計算機愛好者
3. 術語解釋

靜態加載類(編譯時加載類):大多數情況下都是使用這種形式。比如我們定義了一個類A,實例化采用A a = new A()接著就可以通過a對象調用相關方法或屬性,這就是靜態加載類的過程。

動態加載類(運行時加載類):所謂動態加載類,只需要通過Class c = Class.forName("類的全名")即可獲得類類型,然後通過調用A a = c.newInstance()方法即可實例化這個類。

本質的區別在於靜態加載的類的源程序在編譯時期加載(必須存在),而動態加載的類在編譯時期可以缺席(源程序不必存在)。

反射機制:在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。

4. 反射功能

反射機制主要提供了以下功能:

  1. 在運行時判斷任意一個對象所屬的類;
  2. 在運行時構造任意一個類的對象;
  3. 在運行時判斷任意一個類所具有的成員變量和方法;
  4. 在運行時調用任意一個對象的方法;
  5. 生成動態代理。

在JDK中,主要通過以下類實現java反射機制,這些類都位於java.lang.reflect包中。

  • Class:代表一個類
  • Filed:代表類的成員變量或者說成員屬性
  • Method:代表類的方法
  • Constructor:代表類的構造方法
  • Array:提供了動態創建數組,以及訪問數組元素的靜態方法

首先,需要定義測試使用的類

4.1.  獲取類的Class對象

Class 類的實例,表示正在運行的 Java 應用程序中的類和接口。獲取類的Class對象有多種方式:

可以通過反射機制得到某個類的某個屬性,然後改變對應於這個類的某個實例的該屬性值。JAVA 的Class<T>類提供了幾個方法獲取類的屬性。

4.2.  獲取類的Fields

使用樣例如下圖所示:

可見getFields和getDeclaredFields區別:

getFields返回的是申明為public的屬性,包括父類中定義,

getDeclaredFields返回的是指定類定義的所有定義的屬性,不包括父類的。

4.3.  獲取類的Method

通過反射機制得到某個類的某個方法,然後調用對應於這個類的某個實例的該方法

Class<T>類提供了幾個方法獲取類的方法。

 使用樣例如下圖所示:

4.4.  獲取類的Constructor

通過反射機制得到某個類的構造器,然後調用該構造器創建該類的一個實例

Class<T>類提供了幾個方法獲取類的構造器。


使用樣例如下圖所示:

4.5.  新建類的實例

通過反射機制創建新類的實例,有幾種方法可以創建

通過反射獲取類Method對象,調用Field的Invoke方法調用函數。

4.6.  調用類的函數

 調用後結果如下圖所示

上面失敗是由於沒有權限調用private函數,這裡需要設置Accessible為true;

 

4.7.  設置/獲取類的屬性值

通過反射獲取類的Field對象,調用Field方法設置或獲取值

調用後結果如下圖:

4.8.  實例化對象並調用其方法

Person中有兩個方法,sayHi和sayHello

通過已定義的類字符串變量,實例化該類,創建對象,然後根據傳入的方法參數,調用Person中的方法

調用後結果如下圖:

不管是類名還是方法名,都可以定義在配置文件中,然後讀取實例化、方法調用,通常Java web框架都是如此,數通暢聯Hotweb MVC框架也有類似機制,具體參加5.4節。

5. 應用實例 5.1.  ArrayList中存放對象

在泛型為Integer的ArrayList中存放一個String類型的對象。

5.2.  修改數組的信息

修改數組的信息實例,如下圖:

5.3.  修改數組的大小

修改數組的大小實例,如下圖:

5.4.  Hotweb框架經典樣例

以數通暢聯基礎Hotweb MVC框架為例說明反射機制

首先,在DispatchServlet轉發請求至Handler時,需要實例化handler對象。

其中,在HandlerParser類中,使用handlerId通過配置文件HandlerModule.xml讀取到對應Handler並實例化。

然後,通過instantiateHandler方法,添加handler的屬性,

最後,在實例化了handler對象後,通過傳入名為actionType的變量參數調用handler中對應名稱的方法。

在獲取方法名的時候,默認是prepareDisplay

最後,通過反射得到的Method對象,調用Field的Invoke方法調用指定的函數。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved