反射(Reflection)機制

2021-04-16 09:36:59 字數 1409 閱讀 7541

反射(reflection)是.net中的重要機制,通過放射,可以在執行時獲得.net中每乙個型別(包括類、結構、委託、介面和列舉等)的成員,包括方法、屬性、事件,以及建構函式等。還可以獲得每個成員的名稱、限定符和引數等。有了反射,即可對每乙個型別瞭如指掌。如果獲得了建構函式的資訊,即可直接建立物件,即使這個物件的型別在編譯時還不知道。

程式**在編譯後生成可執行的應用,我們首先要了解這種可執行應用程式的結構。

應用程式結構分為應用程式域—程式集—模組—型別—成員幾個層次,公共語言執行庫載入器管理應用程式域,這種管理包括將每個程式集載入到相應的應用程式域以及控制每個程式集中型別層次結構的記憶體布局。

程式集包含模組,而模組包含型別,型別又包含成員,反射則提供了封裝程式集、模組和型別的物件。我們可以使用反射動態地建立型別的例項,將型別繫結到現有物件或從現有物件中獲取型別,然後呼叫型別的方法或訪問其字段和屬性。反射通常具有以下用途。

(1)使用assembly定義和引導程式集,載入在程式集清單中列出模組,以及從此程式集中查詢型別並建立該型別的例項。

(2)使用module了解包含模組的程式集以及模組中的類等,還可以獲取在模組上定義的所有全域性方法或其他特定的非全域性方法。

(3)使用constructorinfo了解建構函式的名稱、引數、訪問修飾符(如pulic 或private)和實現詳細資訊(如abstract或virtual)等。使用type的getconstructors或getconstructor方法來呼叫特定的建構函式。

(4)使用methodinfo了解方法的名稱、返回型別、引數、訪問修飾符(如pulic 或private)和實現詳細資訊(如abstract或virtual)等。使用type的getmethods或getmethod方法來呼叫特定的方法。

(5)使用fiedinfo了解欄位的名稱、訪問修飾符(如public或private)和實現詳細資訊(如static)等,並獲取或設定字段值。

(6)使用eventinfo了解事件的名稱、事件處理程式資料型別、自定義屬性、宣告型別和反射型別等,新增或移除事件處理程式。

(7)使用propertyinfo了解屬性的名稱、資料型別、宣告型別、反射型別和唯讀或可寫狀態等,獲取或設定屬性值。

(8)使用parameterinfo了解引數的名稱、資料型別、是輸入引數還是輸出引數,以及引數在方法簽名中的位置等。

system.reflection.emit命名空間的類提供了一種特殊形式的反射,可以在執行時構造型別。

反射也可用於建立稱為型別瀏覽器的應用程式,使使用者能夠選擇型別,然後檢視有關選定型別的資訊。

此外,jscript等語言編譯器使用反射來構造符號表。system.runtime.serialization命名空間中的類使用反射來訪問資料並確定要永久儲存的字段,system.runtime.remoting命名空間中的類通過序列化來間接地使用反射。

PHP 反射機制Reflection

php 反射機制reflection 簡介php reflection api是php5才有的新功能,它是用來匯出或提取出關於類 方法 屬性 引數等的詳細資訊,包括注釋。class reflection inte ce reflector class reflectionexception exte...

PHP中的reflection反射機制測試例子

j a類反射應用得非常廣泛幾乎是所有框架的最核心部分,php程式設計師似乎從不關心反射。嘗試著用j a的思想去理解php的反射,跟j a基本上基本一致。參考了php手冊 reflecttest.php class reflecttest public function construct useri...

C 程式設計 Reflection 反射

學習c 已有不長不短的一段時間了,反射對我來說一直是很神秘,讓我敬而遠之,開始做公司系統也有近三個月的時間了,從開始到公司熟悉業務,時逢缺人之季,沒過幾天就開始修改bug,到後來做些小需求,做為乙個剛畢業沒啥經驗的新人來說也不可能讓我做什麼太高深的東西,一直這麼忙碌著,到現在系統一些很具體的東西也沒...