C 中的反射原理及應用

2021-07-14 15:31:09 字數 2225 閱讀 9022

反射的概述

反射的定義:審查元資料並收集關於它的型別資訊的能力。元資料(編譯以後的最基本資料單元)就是一大堆的表,當編譯程式集或者模組時,編譯器會建立乙個類定義表,乙個字段定義表,和乙個方法定義表等,。system.reflection命名空間包含的幾個類,允許你反射(解析)這些元資料表的**

和反射相關的命名空間(我們就是通過這幾個命名空間訪問反射資訊):

system.reflection.memberinfo

system.reflection.eventinfo

system.reflection.fieldinfo

system.reflection.methodbase

system.reflection.constructorinfo

system.reflection.methodinfo

system.reflection.propertyinfo

system.type

system.reflection.assembly

反射的作用:

1. 可以使用反射動態地建立型別的例項,將型別繫結到現有物件,或從現 有物件中獲取型別

2. 應用程式需要在執行時從某個特定的程式集中載入乙個特定的型別,以便實現某個任務時可以用到反射。

3. 反射主要應用與類庫,這些類庫需要知道乙個型別的定義,以便提供更多的功能。

應用要點:

利用反射獲取型別資訊

前面講完了關於程式集的反射,下面在講一下反射層次模型中的第三個層次,型別反射

乙個簡單的利用反射獲取型別資訊的例子:

using system;

using sytem.reflection;

class reflecting

//定義乙個獲取反射內容的方法

void getreflectioninfo(assembly myassembly)}}

其它幾種獲取type物件的方法:

1. system.type 引數為字串型別,該字串必須指定型別的完整名稱(包括其命名空間)

2. system.type 提供了兩個例項方法:getnestedtype,getnestedtypes

3. syetem.reflection.assembly 型別提供的例項方法是:gettype,gettypes,getexporedtypes

4. system.reflection.moudle 提供了這些例項方法:gettype,gettypes,findtypes

設定反射型別的成員

反射型別的成員就是反射層次模型中最下面的一層資料。我們可以通過type物件的getmembers 方法取得乙個型別的成員。如果我們使用的是不帶引數的getmembers,它只返回該型別的公共定義的靜態變數和例項成員,我們也可以通過使用帶引數的getmembers通過引數設定來返回指定的型別成員。具體引數參考msdn 中system.reflection.bindingflags 列舉型別的詳細說明。

例如://設定需要返回的型別的成員內容

bindingflags bf=bingdingflags.declaredonly|bingdingflags.nonpublic|bingdingflags.public;

foreach (memberinfo mi int t.getmembers(bf))

通過反射建立型別的例項

如果你想要獲得乙個型別繼承的所有介面集合,可以呼叫type的findinte***ces getinte***ce或者getinte***ces。所有這些方法只能返回該型別直接繼承的介面,他們不會返回從乙個介面繼承下來的介面。要想返回介面的基礎介面必須再次呼叫上述方法。

反射的效能:

使用反射來呼叫型別或者觸發方法,或者訪問乙個字段或者屬性時clr 需要做更多的工作:校驗引數,檢查許可權等等,所以速度是非常慢的。所以盡量不要使用反射進行程式設計,對於打算編寫乙個動態構造型別(晚繫結)的應用程式,可以採取以下的幾種方式進行代替:

1.通過類的繼承關係。讓該型別從乙個編譯時可知的基礎型別派生出來,在執行時生成該型別的乙個例項,將對其的引用放到其基礎型別的乙個變數中,然後呼叫該基礎型別的虛方法。

2. 通過介面實現。在執行時,構建該型別的乙個例項,將對其的引用放到其介面型別的乙個變數中,然後呼叫該介面定義的虛方法。

3.通過委託實現。讓該型別實現乙個方法,其名稱和原型都與乙個在編譯時就已知的委託相符。在執行時先構造該型別的例項,然後在用該方法的物件及名稱構造出該委託的例項,接著通過委託呼叫你想要的方法。這個方法相對與前面兩個方法所作的工作要多一些,效率更低一些

C 中的反射原理及應用

反射的概述 反射的定義 審查元資料並收集關於它的型別資訊的能力。元資料 編譯以後的最基本資料單元 就是一大堆的表,當編譯程式集或者模組時,編譯器會建立乙個類定義表,乙個字段定義表,和乙個方法定義表等,system.reflection命名空間包含的幾個類,允許你反射 解析 這些元資料表的 syste...

C 中的反射原理及應用

注 本文 滄海桑田的部落格 反射的概述 反射的定義 審查元資料並收集關於它的型別資訊的能力。元資料 編譯以後的最基本資料單元 就是一大堆的表,當編譯程式集或者模組時,編譯器會建立乙個類定義表,乙個字段定義表,和乙個方法定義表等,system.reflection命名空間包含的幾個類,允許你反射 解析...

java中反射的原理

簡單的回憶下,下次做具體的分析。首先有乙個反射包,這個包裡有這些類,方法類 放類裡的一些方法,構造方法類,放構造方法資訊 欄位類,放類的一些字段資訊,class類,這個類的型別資訊,乙個類在編譯完後會形成乙個.class檔案,這個檔案裡會有乙個class類存放這個類的型別資訊。執行期間,我們如果要產...