下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、反射與C嫁現(xiàn)【摘要】該文對(duì)反射較為深入的分析,介紹了反射的用途和特點(diǎn),并著重介紹了反射的性能優(yōu)化方法。【關(guān)鍵詞】反射;C#;軟件中圖分類號(hào):TP39文獻(xiàn)標(biāo)識(shí)碼A文章編號(hào)1006-0278(2015)11-127-01當(dāng)你做一個(gè)軟件可以安裝插件的功能,你連插件的類型名稱都不知道,你怎么實(shí)例化這個(gè)對(duì)象呢?因?yàn)槌绦蚴侵С植寮模ǖ谌降模陂_發(fā)的時(shí)候并不知道。所以,無(wú)法在代碼中New出來(lái),但反射可以,通過(guò)反射,動(dòng)態(tài)加載程序集,然后讀出類,檢查標(biāo)記之后再實(shí)例化對(duì)象,就可以獲得正確的類實(shí)例。反射的目的就是為了擴(kuò)展未知的應(yīng)用。比如你寫了一個(gè)程序,這個(gè)程序定義了一些接口,只要實(shí)現(xiàn)了這些接口的dll都可以作
2、為插件來(lái)插入到這個(gè)程序中。那么怎么實(shí)現(xiàn)呢?就可以通過(guò)反射來(lái)實(shí)現(xiàn)。就是把dll加載進(jìn)內(nèi)存,然后通過(guò)反射的方式來(lái)調(diào)用dll中的方法。反射Reflection,MFC時(shí)代叫RTTI(RuntimeTypeIdentification)運(yùn)行時(shí)類型識(shí)別,提供一種動(dòng)態(tài)創(chuàng)建對(duì)象的能力。反射(Reflection)是.NET中的重要機(jī)制,通過(guò)反射,可以在運(yùn)行時(shí)獲得.NET中每一個(gè)類型(包括類、結(jié)構(gòu)、委托、接口和枚舉等)的成員,包括方法、屬性、事件,以及構(gòu)造函數(shù)等。還可以獲得每個(gè)成員的名稱、限定符和參數(shù)等。有了反射,即可對(duì)每一個(gè)類型了如指掌。如果獲得了構(gòu)造函數(shù)的信息,即可直接創(chuàng)建對(duì)象,即使這個(gè)對(duì)象的類型在編譯時(shí)
3、還不知道。程序代碼在編譯后生成可執(zhí)行的應(yīng)用,我們首先要了解這種可執(zhí)行應(yīng)用程序的結(jié)構(gòu)。應(yīng)用程序結(jié)構(gòu)分為應(yīng)用程序域一程序集一模塊一類型一成員幾個(gè)層次,公共語(yǔ)言運(yùn)行庫(kù)加載器管理應(yīng)用程序域,這種管理包括將每個(gè)程序集加載到相應(yīng)的應(yīng)用程序域以及控制每個(gè)程序集中類型層次結(jié)構(gòu)的內(nèi)存布局。程序集包含模塊,而模塊包含類型,類型又包含成員,反射則提供了封裝程序集、模塊和類型的對(duì)象。我們可以使用反射動(dòng)態(tài)地創(chuàng)建類型的實(shí)例,將類型綁定到現(xiàn)有對(duì)象或從現(xiàn)有對(duì)象中獲取類型,然后調(diào)用類型的方法或訪問其字段和屬性。可以使用ConstructorInfo了解構(gòu)造函數(shù)的名稱、參數(shù)、訪問修飾符(如pulic或private)和實(shí)現(xiàn)詳細(xì)信
4、息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法來(lái)調(diào)用特定的構(gòu)造函數(shù)。System.Reflection.Emit命名空間的類提供了一種特殊形式的反射,可以在運(yùn)行時(shí)構(gòu)造類型。反射也可用于創(chuàng)建稱為類型瀏覽器的應(yīng)用程序,使用戶能夠選擇類型,然后查看有關(guān)選定類型的信息。在設(shè)計(jì)模式實(shí)現(xiàn)中常使用反射技術(shù),如采用反射技術(shù)可以簡(jiǎn)化工廠的實(shí)現(xiàn)。;通過(guò)反射可以將需要實(shí)現(xiàn)的子類名稱傳遞給工廠方法,這樣無(wú)須在子類中實(shí)現(xiàn)類的實(shí)例化;使用反射可以減少抽象工廠的子類;采用反射技術(shù)可以簡(jiǎn)化工廠代碼的復(fù)雜程度,在.NET項(xiàng)目中,采用反射技術(shù)的工廠已經(jīng)基
5、本代替了工廠方法;采用反射技術(shù)可以極大地簡(jiǎn)化對(duì)象的生成,對(duì)以下設(shè)計(jì)模式的實(shí)現(xiàn)也有很大影響。反射的層次間都是一對(duì)多的關(guān)系。使用反射可以使用反射動(dòng)態(tài)地創(chuàng)建類型的實(shí)例,將類型綁定到現(xiàn)有對(duì)象,或從現(xiàn)有對(duì)象中獲取類型;應(yīng)用程序需要在運(yùn)行時(shí)從某個(gè)特定的程序集中載入一個(gè)特定的類型,以便實(shí)現(xiàn)某個(gè)任務(wù)時(shí)可以用到反射;反射主要應(yīng)用與類庫(kù),這些類庫(kù)需要知道一個(gè)類型的定義,以便提供更多的功能。調(diào)用AppDomain對(duì)象的GetAssemblies方法將返回一個(gè)由System.Reflection.Assembly元素組成的數(shù)組。顯示的調(diào)用一個(gè)程序集,system.reflecton.assembly類型提供了下面三種
6、方法:1 .Load方法:極力推薦的一種方法,Load方法帶有一個(gè)程序集標(biāo)志并載入它,Load將引起CLR把策略應(yīng)用到程序集上,先后在全局程序集緩沖區(qū),應(yīng)用程序基目錄和私有路徑下面查找該程序集,如果找不到該程序集系統(tǒng)拋出異常。2 .LoadFrom方法:傳遞一個(gè)程序集文件的路徑名(包括擴(kuò)展名),CLR會(huì)載入您指定的這個(gè)程序集,傳遞的這個(gè)參數(shù)不能包含任何關(guān)于版本號(hào)的信息,區(qū)域性,和公鑰信息,如果在指定路徑找不到程序集拋出異常。3 .LoadWithPartialName:永遠(yuǎn)不要使用這個(gè)方法,因?yàn)閼?yīng)用程序不能確定再在載入的程序集的版本。該方法的唯一用途是幫助那些在.Net框架的測(cè)試環(huán)節(jié)使用.ne
7、t框架提供的某種行為的客戶,這個(gè)方法將最終被拋棄不用。如果你想要獲得一個(gè)類型繼承的所有接口集合,可以調(diào)用Type的FindInterfacesGetInterface或者GetInterfaces。所有這些方法只能返回該類型直接繼承的接口,他們不會(huì)返回從一個(gè)接口繼承下來(lái)的接口。要想返回接口的基礎(chǔ)接口必須再次調(diào)用上述方法。使用反射來(lái)調(diào)用類型或者觸發(fā)方法,或者訪問一個(gè)字段或者屬性時(shí)clr需要做更多的工作:校驗(yàn)參數(shù),檢查權(quán)限等等,所以速度是非常慢的。所以盡量不要使用反射進(jìn)行編程,對(duì)于打算編寫一個(gè)動(dòng)態(tài)構(gòu)造類型(晚綁定)的應(yīng)用程序,可以采取以下的幾種方式進(jìn)行代替:1 .通過(guò)類的繼承關(guān)系。讓該類型從一個(gè)編譯時(shí)可知的基礎(chǔ)類型派生出來(lái),在運(yùn)行時(shí)生成該類型的一個(gè)實(shí)例,將對(duì)其的引用放到其基礎(chǔ)類型的一個(gè)變量中,然后調(diào)用該基礎(chǔ)類型的虛方法。2 .通過(guò)接口實(shí)現(xiàn)。在運(yùn)行時(shí),構(gòu)建該類型的一個(gè)實(shí)例,將對(duì)其的引用放到其接口類型的一個(gè)變量中,然后調(diào)用該接口定義的虛方法。3 .通過(guò)委托實(shí)現(xiàn)。讓該類型實(shí)現(xiàn)一個(gè)方法,其名稱和原型都與一個(gè)在編譯時(shí)就已知的委托相符。在運(yùn)行時(shí)先構(gòu)造該類型的實(shí)例,然后在用該方法的對(duì)象及名稱構(gòu)造出該委托的實(shí)例,接著通過(guò)委托調(diào)用你想要的方法
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高校與企業(yè)合作協(xié)議教授聘請(qǐng)合同范本3篇
- 2025版木門企業(yè)安全生產(chǎn)責(zé)任書合同范本2篇
- 2025年分期付款運(yùn)動(dòng)服裝合同
- 2025年分期室內(nèi)設(shè)計(jì)服務(wù)合同
- 跨國(guó)集團(tuán)2025年度全球營(yíng)銷戰(zhàn)略合同2篇
- 2025年版?zhèn)€人汽車買賣合同示范文本3篇
- 2025年汽車配件贈(zèng)與協(xié)議
- 二零二五年敬老院養(yǎng)老用品銷售與售后服務(wù)合同規(guī)范3篇
- 2025版教育培訓(xùn)機(jī)構(gòu)合作協(xié)議樣本3篇
- 2025版學(xué)生實(shí)訓(xùn)基地實(shí)習(xí)就業(yè)保障服務(wù)合同3篇
- 《社會(huì)工作實(shí)務(wù)》全冊(cè)配套完整課件3
- 單位違反會(huì)風(fēng)會(huì)書檢討書
- 2024年4月自考00832英語(yǔ)詞匯學(xué)試題
- 《電力用直流電源系統(tǒng)蓄電池組遠(yuǎn)程充放電技術(shù)規(guī)范》
- 《哪吒之魔童降世》中的哪吒形象分析
- 信息化運(yùn)維服務(wù)信息化運(yùn)維方案
- 汽車修理廠員工守則
- 公安交通管理行政處罰決定書式樣
- 10.《運(yùn)動(dòng)技能學(xué)習(xí)與控制》李強(qiáng)
- 冀教版數(shù)學(xué)七年級(jí)下冊(cè)綜合訓(xùn)練100題含答案
- 1神經(jīng)外科分級(jí)護(hù)理制度
評(píng)論
0/150
提交評(píng)論