NET中的反射機制概述

來源:互聯網
上載者:User

一.什麼是反射: 
反射提供的是一種封裝程式集、模組和類型的對象。通過反射可以動態地建立類型的執行個體,將類型綁定到現
有對象,或從現有對象中擷取類型。然後,可以調用類型的方法或訪問其欄位和屬性。

 

二.為什麼使用反射(反射的優點):

使用反射可以使得我們很容易地使用自己或第三方開發的類型來增強應用程式的功能,從而設計出可動態擴充的應用程式。

三.反射的典型應用:

需要使用反射類型的應用程式比較少,我們也應當盡量避免使用它(效能問題)。

反射類型典型地應用於一些類庫,這些類庫通常需要理解一個類型的定義,以便提供某些豐富的功能。例如,FCL中的序列化
機制,它使用反射來確定一個類型中定義了哪些欄位,以便擷取它們的值並寫入位元組流在網路上傳輸(序列化機制
參見.NET Remoting相關知識)。

另外,當應用程式需要在運行時載入某個特定的類型或程式集時,需要用到反射。

四.反射的主要用途:

1.         反射程式集(程式集>模組>類型>類型成員)

使用 Assembly定義和載入程式集,獲得程式集的相關資訊; 

執行個體方法:GetAssemblies()

2.         反射程式集中的模組

        使用 Module載入在資訊清單中列出的模組,獲得程式集中模組的相關資訊;

     執行個體方法:GetModules()

3.       反射模組中的類型

使用Type載入類型,獲得模組中的類型資訊;

執行個體方法:GetTypes()

4.         反射類型中的成員

使用MemberInfo載入成員,獲得類型中的成員資訊。

執行個體方法:GetMembers()

注意:這裡可反射的成員可包括私人成員,可以利用將枚舉類型BindingFlags作為參數傳給重載的GetMembers方法。但是
這種權利不應當被濫用,.NET Reflection採用了CAS機制(代碼訪問安全機制)保證了這點。(枚舉類型
BindingFlags的說明詳見 MSDN)

     反射類型中成員的目的包括:

1)建立一個類型的執行個體

       System.Activator的CreateInstance方法

       System.Activator的CreateInstanceFrom方法

       System.AppDomain的一些執行個體方法

           例如,CreateInstance, CreateInstanceAndUnwrap, CreateInstanceFrom, CreateInstanceFromAndUnwrap

       System.Type 的InvokeMember執行個體方法

       System.Reflection.ConstructorInfo的Invoke執行個體方法

 

2)調用一個類型的方法

綁定和調用都執行:System.Type 的InvokeMember執行個體方法(注意:InvokeMember不支援事件)

綁定和調用分離:(訪問頻繁時)

   可用來綁定成員的類型包括:ConstructorInfo、MethodInfo、FieldInfo、EventInfo、PropertyInfo。

使用 ConstructorInfo 瞭解以下資訊:建構函式的名稱、參數、存取修飾詞(如 public 或 private)和實現詳細資料
(如 abstract 或 virtual)等。使用 Type 的 GetConstructors 或 GetConstructor 方法來調用特定的建構函式。

使用 MethodInfo 瞭解以下資訊:方法的名稱、傳回型別、參數、存取修飾詞(如 public 或 private)和實現詳細資料
(如 abstract 或 virtual)等。使用 Type 的 GetMethods 或 GetMethod 方法來調用特定的方法。

使用 FieldInfo 瞭解以下資訊:欄位的名稱、存取修飾詞(如 public 或 private)和實現詳細資料(如 static)等;
並擷取或設定欄位值。

使用 EventInfo 來瞭解如下的類似資訊:事件的名稱、事件處理常式資料類型、自訂屬性、宣告類型和反射類型等;
並添加或移除事件處理常式。

使用 PropertyInfo 來瞭解如下的類似資訊:屬性的名稱、資料類型、宣告類型、反射類型和唯讀或可寫狀態等;
並擷取或設定屬性值。

五.為什麼不使用反射(反射的缺點):

       使用反射來調用方法或者訪問欄位和屬性等會造成效能的下降,原因有四:

1)在尋找成員時,綁定操作會導致頻繁的字串比較;

2)在傳遞參數時,需要先構造一個數組並初始化其中的元素。然後在內部方法調用時,反射機制又要從數組中提取參數,
並將它們放到堆棧上;

3)CLR檢查傳入方法的參數個數與類型帶來的效能開銷;

4)CLR確保調用者有適當的安全許可來訪問成員帶來的效能開銷。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.