1. 程式人生 > 其它 >C#基礎系列-反射的原理

C#基礎系列-反射的原理

一、前言

  反射(Reflection)的內容在部落格中已經寫了一篇,什麼是反射,反射的使用,反射優缺點總結;在面試中突然被問道反射的原理,按照理解反射就是在Reflection名稱空間和物件的Type物件獲取類的方法、屬性、特性等成員資訊,但是又被問道為什麼可以獲取這些成員資訊?就是反射機制依據的是什麼,讓其可以使用反射來獲取程式集、程式集的類、建立物件、執行方法、獲取屬性和特性資訊。

  本篇文章就是要講述清楚反射是怎麼或者說如何獲取程式資訊?

二、內容

反射是如何通過如下的Reflection名稱空間的類與方法獲取獲取類,方法名?

名稱空間 描述
System.Reflection.Assembly 程式集
System.Reflection.MemberInfo 成員資訊
System.Reflection.EventInfo 事件
System.Reflection.FieldInfo 欄位
System.Reflection.MethodBase 基類方法
System.Reflection.ConstructorInfo 建構函式
System.Reflection.MethodInfo 方法
System.Reflection.PropertyInfo 屬性
System.Type 類、物件的型別物件

  主要依據了元資料(metadata)

,在程式高階語言中(C#)元資料的表現形式是一種二進位制資訊,用以對儲存在公共語言執行庫可移動執行檔案(PE)或者儲存在記憶體中程式進行描述,編譯器將程式碼編譯成PE檔案時便會將元資料插入到該檔案的一部分,而將程式碼轉換為 Microsoft 中間語言 (MSIL) 並將其插入到該檔案的另一部分中,所以包含元資料和使用中間語言將程式碼生成的部分。元資料將儲存如下資訊,程式集(名稱、版本、區域性、公鑰)、類的說明(名稱、可見性、基類和實現的介面)、類的成員(方法、欄位、屬性、事件、巢狀的型別)等。當執行程式碼的時候,執行庫將元資料載入到記憶體中,並通過引用它(元資料)來發現有關程式碼的類、成員、繼承等資訊。

  反射則是審查元資料並收集關於它的型別資訊的能力,元資料(編譯後的最基本資料單元)一些表,當編譯程式集貨模組時,編譯器會建立如下資訊。1、關於程式集的元資料(清單)主要包含如下資訊:標識資訊(包括程式集的名稱、版本、文化和公鑰等);檔案列表(程式集由哪些檔案組成);引用程式集列表(該程式集所引用的其他程式集);一組許可請求(執行這個程式集需要的許可)。2、關於型別的元資料包含一個類定義表、一個欄位定義表、一個方法定義表、方法引數表等,System.reflection名稱空間包含的幾個類,允許你反射(解析)這些元資料表的程式碼 。

三、總結

  通過面試被問到反射的原理,基於目前知識面只是知道反射是什麼,怎麼使用的,因為這件事情促使進一步深究瞭解到程式集,元資料的內容,瞭解到反射實現機制。從而對整個知識串聯起來,形成一個體系,融會貫通。所以技術的學習過程是一個深入探究的過程,形成體系的過程,慢慢就會融會貫通了。