反射(reflection)是
.net
中的重要機制,通過放射,可以在執行時獲得.net中每乙個型別(包括類、結構、委託、介面和列舉等)的成員,包括方法、屬性、事件,以及建構函式等。還可以獲得每個成員的名稱、限定符和引數等。有了反射,即可對每乙個型別瞭如指掌。如果獲得了建構函式的資訊,即可直接建立物件,即使這個物件的型別在編譯時還不知道。
1、.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命名空間的類提供了一種特殊形式的反射,可以在執行時構造型別。
反射也可用於建立稱為型別瀏覽器的應用程式,使使用者能夠選擇型別,然後檢視有關選定型別的資訊。
此外,jscript等語言編譯器使用反射來構造符號表。system.runtime.serialization命名空間中的類使用反射來訪問資料並確定要永久儲存的字段,system.runtime.
remoting
命名空間中的類通過序列化來間接地使用反射。
2、反射技術示例
下面是反射技術的示例,我們可以在程式去得時動態例項化物件,獲得物件的屬性,並呼叫物件的方法。
1namespace reflectionexample
2 16 system.console.readline ( );
17 system.console.writeline (「列出hellword中的所有方法」 );
18 type ht = typeof(helloworld);
19 methodinfo mif = ht.getmethods();
20 foreach(methodinfo mf in mif)
21
24 system.console.readline();
25 system.console.writeline("例項化helloworld,並呼叫sayhello方法");
26 object obj = activator.createinstance(ht);
27 string s = ;
28 object bojname = activator.createinstance(ht,s);
29 bindingflags flags = (bindingflags.nonpublic|bindingflags.public|bindingflags.static|bindingflags.instance|bindingflags.declaredonly);
30 methodinfo msayhello = ht.getmethod("sayhello");
31 msayhello.invoke(obj,null);
32 msayhello.invoke(objname,null);
33 system.console.readline();
34 }
35 }
36}
1using system;
2namespace reflectionexample
3 11 public helloworld() : this(null)
12 {}
13 public string name
14
19 }
20 public void sayhello()
21
26 else
27
30 }
31 }
32}
33
3、在設計模式實現中使用反射技術
採用反射技術可以簡化工廠的實現。
(1)工廠方法:通過反射可以將需要實現的子類名稱傳遞給工廠方法,這樣無須在子類中實現類的例項化。
(2)抽象工廠:使用反射可以減少抽象工廠的子類。
採用反射技術可以簡化工廠**的複雜程度,在.net專案中,採用反射技術的工廠已經基本代替了工廠方法。
反射與工廠設計模式
工廠設計模式的一般格式 介面 實現對應介面的子類 工廠類通過反射技術改進的工廠,不再使用new關鍵字來例項化物件了 package com.reflect.factory.model inte ce ifruit ifruit class factory public static ifruit g...
Java反射與工廠設計模式
如 傳統工廠類 inte ce ifruit public void eat class orange implements ifruit class factory public static ifruit getinstance string name if orange equals name...
C 設計模式 反射模式
ifndef reflect h define reflect h include include 反射 就是程式在執行的過程中,可以通過類名稱建立物件,並獲取類中申明的成員變數和方法。反射雖然不屬於二十三種設計模式,卻是很重要的一種機制,c 語言並不支援反射,所以只能通過一些手段模擬實現。建立具體...