反射原理是什麼

2022-02-16 00:56:13 字數 3645 閱讀 5893

以前,假設我們要不借助任何類庫直接解析json協議的東西,比如,並且我們需要將他們賦給乙個與之對應的實體類。那麼我們需要寫出如下的**來解析

//

這只是一段偽**

while(str.length!=0)else

if(name=="b")

else

}

從上面**中,可以知道,當要為乙個實體類賦值和解析的屬性比較少的時候,我們要寫的**還是可以讓人接受的,但是一旦實體類的**一多,那麼整個過程就非常地噁心。通過反射,我們可以獲取乙個實體類中的資訊,通過獲取執行時的函式資訊,我們又可以動態地呼叫函式,為實體類動態賦值。以上**如果用反射的相關方法來寫的話,就會變得異常簡潔。

//

這只是一段偽**

while(str.length!=0)

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

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

我們有乙個helloworld類,我們想要通過反射動態地獲取他的資訊,並動態地呼叫他的方法。

public

class

helloworld

public

helloworld()

: this(null

)

public

string

name

}public

void

sayhello()

}

下面我們將應用反射進行獲取方法名、動態建立類的例項、動態呼叫方法

static

void main(string

args)

\n\n

", massembly.getname());

type mtype =massembly.gettypes();

console.writeline(

"以下是程式集裡面的型別");

for (int i = 0; i < mtype.length; i++)

.", i, mtype[i].name);

}type ht = typeof

(helloworld);

methodinfo mmethodinfo = ht.getmethods();//

利用反射獲取helloworld裡所有的方法

console.writeline("

hello world類中所有的方法:");

for (int i = 0; i < mmethodinfo.length; i++)

.", i, mmethodinfo[i].name);

}console.writeline(

"利用activator.createinstance建立例項");

object obj1 = activator.createinstance(ht);//

利用activator.createinstance建立不同的例項obj1和obj2

string name = "

chenzherong";

object obj2 =activator.createinstance(ht, name);

methodinfo msayhello = ht.getmethod("

sayhello");

console.writeline(

"\tobj1的輸出");

msayhello.invoke(obj1,

null

);

console.writeline(

"\tobj2的輸出");

msayhello.invoke(obj2,

null

); }

結果截圖如下所示

要徹底地了解反射,我們還需要了解.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命名空間的類提供了一種特殊形式的反射,可以在執行時構造型別。

參考連線

c# 參考:反射 -- 學習筆記整理,概念與應用

什麼是反射?

c# 反射技術應用

system.reflection 命名空間

反射是什麼?

import commons def run 反射就是利用字串形式去物件中 模組 getattr 操作 尋找成員。delattr 是刪除成員setattr 是設定成員 新增 hasattr 檢查注意這是基於記憶體來操作的。inp input 請輸入要訪問的url m,f inp.split obj ...

工作原理是什麼 超濾機工作原理是什麼

超濾機即使用超濾技術對水進行淨化處理的裝置。與其它淨水裝置的區別在於它的裝置中使用有超濾膜。其工作原理是採用一種加壓膜分離技術,即在一定的壓力下,使小分子溶質和溶劑穿過一定孔徑的特製的薄膜,而使大分子溶質不能透過,留在膜的一邊,從而使大分子物質得到了部分的純化。超濾根據所加的操作壓力和所用膜的平均孔...

工作原理是什麼 馬桶水箱工作原理是什麼

馬桶水箱工作原理是什麼 它主要是利用排水閥來將裡面的水放出,然後當裡面的水被排完後,水塞便會落下將出水口給堵住。而浮球便會下落將進水閥給拉起,這時水箱就開始注水了,水面在上公升時,浮球也會隨之公升高,當它到達一定高度時,水塞便會將進水口堵住。馬桶選購注意事項 1 挑選馬桶時要注意看它是否屬於哪種陶瓷...