反射的本質 元資料

2021-09-22 06:07:14 字數 1246 閱讀 5915

今天關於反射的爭論不少了,不過,個人覺得為了避免誤導新手,有必要談一下反射的本質。在我看來,反射的本質在於元資料,它是一種獲取和使用元資料的技術。「反射」從字面上理解,可以認為是洞察和使用內部資訊的手段。microsoft等n公司對命名是非常有研究的。

元資料是一種關於資料的資料,有點繞口,說白點就是一種資料的描述資訊。在c#,其元資料存在module中,用於描述這個module所有型別的資訊,這種資訊包括型別描述、型別attribute、成員、事件資訊等,總之,關於乙個class,所有的描述資訊都在這個module的元資料中定義。

我們可以通過reflection這個命名空間來獲取這些元資料,對應乙個程式集的描述是assembly類,對應乙個class的元資料就是type,當然還有constructorinfo、propertyinfo、fieldinfo、eventinfo、methodinfo、parameterinfo、attribute等。利用這個反射命名空間,我們可以獲取乙個assembly中所有型別的描述,利用這些元資料可以動態的建立類的例項,獲取/設定屬性,獲取事件並訂閱事件,呼叫方法,獲取乙個類/屬性/字段/方法/構造器/引數的attribute。我們在程式設計時能做到的事情,利用反射也基本能夠做到。

因此,反射是一種在執行時獲取和使用元資料的技術。其本質在於元資料,這是原理性的,其它的都是從這衍生出來的。如果認為掌握了動態呼叫就認為掌握了反射,那可能需要浪費時間和經歷,最後才知道反射與元資料相關,沒有元資料就沒有反射。這是淺嘗輒止而導致無知的代價。

反射的使用場景大部分都是動態設定型別字段/屬性,或動態呼叫方法。我個人認為,attribute也是反射乙個非常誘人的技術,它可以使使用者通過宣告乙個attribute而附加一些有用的功能,宣告attribute實現一種功能類似於面向上下文程式設計,可以極大簡化**數量。我在乙個agent程式設計平台為了簡化使用者應用,就採用了大量的元資料。

///2

///定義乙個感知天氣變化的智慧型體。

3/// 4

[agent]

5[sensible(

typeof

(environment), 

"temperature")]

6public

inte***ce

imyagent

7我在2023年實現的o-o對映元件也使用了很多的attribute。

反射技術由於其本身的動態性,具備了強大的功能,但是這些功能都是雙刃劍,確實有效能犧牲,因此,應該平衡使用,不是濫用或者不用。要想真正學習反射,最好找本基礎程式設計手冊,系統的學習一下。本文也僅是說了一點皮毛而已。

元資料與反射 一

1.元資料與反射 有關程式以及其型別的資料稱作元資料 也有叫做描述資料的資料 它儲存在程式的程式集中。乙個程式在執行時檢視自己程式的元資料或者其他程式的元資料的行為就叫做反射。2.type類 type類包擴了我們程式使用的型別資訊 成員成員型別 描述name 屬性型別的名字 namespace 屬性...

反射及元類

什麼是反射,其實是反省,自省的意思 反射指的是乙個物件應該具備,可以檢測,修改,增加自身屬性的能力 反射就是通過字串操作屬性 涉及的四個函式,這四個函式就是普通的內建函式 沒有雙下劃線,與print等等沒有區別 class person def init self,name,age,gender s...

利用反射和JDBC元資料編寫通用的查詢方法

先貼 後給設計思路。若有對 中的方法有疑惑的可以檢視jdk幫助文件 使用 jdbc 進行查詢,將結果賦值給物件的 field,返回存放物件的 list 呼叫 preparedstatement 的 executequery 方法進行查詢 resultset 結果集,封裝可使用 jdbc 進行查詢的結...