C 基礎系列 反射的原理

2022-09-23 00:09:13 字數 1442 閱讀 4059

反射(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命名空間包含的幾個類,允許你反射(解析)這些元資料表的** 。

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

C 基礎系列 反射筆記

前言 使用反射也有幾年了,但是一直覺得,反這個概念很抽象,今天有時間就來總結下這個知識點。1 為什麼需要反射 最初使用反射的時候,作為小菜總是不理解,既然可以通過new 乙個物件的方式得到物件,然後通過物件去呼叫屬性和方法,那麼為什麼還需要反射去呼叫呢?後來使用多了發現這就是乙個先繫結還是後繫結的問...

C 基礎系列 反射筆記

前言 使用反射也有幾年了,但是一直覺得,反這個概念很抽象,今天有時間就來總結下這個知識點。1 為什麼需要反射 最初使用反射的時候,作為小菜總是不理解,既然可以通過new 乙個物件的方式得到物件,然後通過物件去呼叫屬性和方法,那麼為什麼還需要反射去呼叫呢?後來使用多了發現這就是乙個先繫結還是後繫結的問...

C 基礎 反射

反射指程式可以訪問 檢測和修改它本身狀態或行為的一種能力。程式集包含模組,而模組包含型別,型別又包含成員。反射則提供了封裝程式集 模組和型別的物件。您可以使用反射動態地建立型別的例項,將型別繫結到現有物件,或從現有物件中獲取型別。然後,可以呼叫型別的方法或訪問其字段和屬性。優點 1 反射提高了程式的...