❶ 什麼叫做反射,反射在編程中起什麼作用
[網路里就有你要的資料,學會搜索,以後這10分就能省下了]
反射<編程>
程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對象。您可以使用反射動態地創建類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。然後,可以調用類型的跡老方法或訪問其欄位和屬性。反射通常具埋舉有以下用途:
1.使用 Assembly 定義和載入程序集,載入在程序集清單中列出的模塊,以及從此程序集中查找類型並創建該類型的實例。
2.使用 Mole 了解如下的類似信息:包含模塊的程序集以及模塊中的類等。您還可以獲取在模塊上定義的所有全局方法或其他特定的非全局方法。
3.使用 ConstructorInfo 了解如下的類似信息:構造函數的名稱、參數、訪問修飾符(如 public 或 private)和實現詳細信息(如 abstract 或 virtual)等。
4.使用 Type 的 GetConstructors 或 GetConstructor 方法來調用特定的構造函數。
5.使用 MethodInfo 來了解如下的類似信息:方法的名稱、返回類型、參數、訪問修飾符(如 public 或 private)和實現詳細信息(如 abstract 或 virtual)等。使用 Type 的 GetMethods 或 GetMethod 方法來調用特定的方法。
6.使用 FieldInfo 來了解如下的類似信息:欄位的名稱、訪問修飾符(如 public 或 private)和實現詳細信息(姿液升如 static)等;並獲取或設置欄位值。
7.使用 EventInfo 來了解如下的類似信息:事件的名稱、事件處理程序數據類型、自定義屬性、聲明類型和反射類型等;並添加或移除事件處理程序。
8.使用 PropertyInfo 來了解如下的類似信息:屬性的名稱、數據類型、聲明類型、反射類型和只讀或可寫狀態等;並獲取或設置屬性值。
9.使用 ParameterInfo 來了解如下的類似信息:參數的名稱、數據類型、參數是輸入參數還是輸出參數,以及參數在方法簽名中的位置等。
❷ C#中的反射怎麼理解啊,請舉一個簡單的例子說明一下啊。謝謝啊。
這個類是可以通過
程序集
(exe,dll)名稱,反射出這個程序集中的內容(引用,方法等等).
例如我有一個叫sample.dll的文件,他的返滾程序集名字就是sample,這個
類庫
文件中有個類叫Test,可以用如下方首團法創建這個類的引用
Assembly.Load("sample").CreateInstance("sample.Test");
sample是程序集的名字,sample.Test是程序集加類名
Assembly.Load是載入這個程序漏芹余集,CreateInstance是創建這個類的引用
當然System.
Reflection
命名空間
中還有很多其他的用於反射的類.你可以參見MSDN
❸ 反射是什麼意思 反射意思是什麼
1、反射是一種自然現象,表現為受刺激物對刺激物的逆反應..反射的外延寬泛。物理學領域是指聲波、光波或其他電磁波遇到別的媒質分界面而部分仍在原物質中傳播遲友毀的現象;生物學領域里反射是在中樞神經系統參與下,機體對內外環境刺激所作出的規律性反應。計算機領域中反射是碼備提供封裝程序集、模塊和類型的對象;電子領域中就是在傳輸線上的回波。
2、研究反射告此產生機制,把握反射規律,有利於人類更好的利用反射進行各種相關工作。其應用領域是相當廣泛的。
❹ C# 什麼是反射
就是根據類型的元數據,動態獲得類型或老遲禪者實例的信息旦拍。
例如,
public class MyClass
{
public void SayHello()
{
}
}
現在我知侍塵道它有個方法是SayHello,那我就可以通過反射的方式來調用該方法。
一般情況下:
MyClass myClass = new MyClass();
myClass.SayHello();
而通過反射:
MyClass myClass = new MyClass();
Type type = typeof(MyClass);
type.GetMethod("SayHello").Invoke(myClass, null);
❺ 怎麼理解Java中的反射,作用是什麼
反射是審查元數據並收集關於它的類型信息的能力。李納元數據(編譯以後的最基本數據單元)就是一大堆的表,當編譯程序集或者模塊時,編譯器會創建一個類定義表,一個欄位定義表,和一個方法定義表等.
反射的主要作用是用來擴展系統和動態調用程序集。
所謂擴展系統就是先把系統寫好,系統裡面定義介面,後面開發的人去寫介面的代碼。
此時該系統就要用反射了,系統用反射調用介面,當介面沒寫,系統利用反射就不會不會出錯,此時就等於沒實現此功能而已,當介面被人寫好了,系統就會自動調用介面的功能展現在系統上。
即反射實現即插即用功能。
動態調用程序集就是利用反射去調用編譯好的dll,當然此時的dll沒有被引用到你所建的工程裡面。
當你編譯你的工程時,不會編譯你調用的dll,當你運行到調用dll時,此時才會去調纖擾余用dll,判斷是否有語法語義,等編譯,運行的錯誤。
這樣利用毀滾反射具有一定靈活性,就是不用從你的工程調用dll,還有就是dll可隨時改變(當然介面還是要對應),不需改變你所建的工程。
總之反射最好的好處就是新建工程時後不須一定要寫好dll,可新建完工程後,後期寫dll也可以。即所謂後期綁定。當然利用反射是耗資源的,損失效率,如果不是在上面的場合利用此技術,可能不會帶來好處,反而是壞處。
❻ c#中的反射要怎樣理解
反射(Reflection)是.NET中的重要機制,通過放射,可以在運行時獲得.NET中每一個類型(包括類、結構、委託、介面和枚舉等)的成員,包括方法、屬性、事件,以及構造函數等。還可以獲得每個成員的名稱、限定符和參數等。有了反射,數兆即可對每一個類型了如指掌。如果獲得了構造函數的信息,即可直接創建對象,即使這個對象的類型在編譯時還不知道。
程序代碼在編譯後生成可執行的應用,我們首先要了解這種可執行應用程序的結構。
應用程序結構分為應用程序域—程序集—模塊—類型—成員幾個層次,公共語言運行庫載入器管理應用程序域,這種管理包括將每個程序集載入到相應的應用程序域以及控制每個程序集中類型層次結構的內存布局。
程序集包含模塊,而模塊包含類型,類型又包含成員,反射則提供了封裝程序集、模塊和類型的對象。我們可以使用反射動態地創建類型的實例,將類型綁定到現有對象或從現有對象中獲取類型,然後調用類型的方法或訪問其欄位和屬性。反射通常具有以下用途。
(1)使用Assembly定義和載入程序集,載入在程序集清單中列出模塊,以及從此程序集中查找類型並創建該類型的實例。
(2)使用Mole了解包含模塊的程序集以及模塊中的類等,還可以獲取在模塊上定義的所有全局方法或其他特定的非全局方法。
(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命名空間中的類通過序列化來間接地使用反射。
❼ C#高階-反射
概念
反射機制是使程序具有動態特性的非常關鍵的一種機制
需求1:根據指定的類名,類欄位名和所對應的數據,得到該類的實例。
需求2:根據指定的裝箱對象 獲取其屬性值或者調用其方法
需求3:獲取未來會產生的程序集 並使用其中的類
讓我們可以於運行時載入、探知、使用編譯期間完全未知的classes。換句話說,程序可以載入一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),並生成其對象實體、或對其fields設值、或喚起其methods1。
反射需要的類
反射用到的命名空間:
System.Reflection
System.Type
System.Reflection.Assembly
(1)使用Assembly定義和載入程序集,載入在程序集清單中列出模塊,以及從此程序集中查找類型並創建該類型的實例。
(2)使用Type這個類可以訪問任何給定數據類型的信息。
(3)使用ConstructorInfo了解構造函數的名稱、參數、訪問修飾符(如pulic 或private)和實現詳細信息(如abstract或virtual)等。
(4)使用MethodInfo了解方法的名稱、返回類型、參數、訪問修飾符(如pulic 或private)和實現詳細信息(如abstract或virtual)等。
(5)使用FiedInfo了解欄位的名稱、訪問修飾符(如public或private)和實現詳細信息(如static)等,並獲取或設置欄位值。
(6)使用PropertyInfo了解屬性的名稱、數據類型、聲明類型、反射類型和只讀或可寫狀態等,獲取或設置屬性值。
System.Type類:
System.Type 類對於反射起著核心的作用。但它是一個抽象的基類,Type有與每種數據類型對應的派氏攔生類則兆,我們使用這個派生類的對象的方法、欄位、屬性來查找有關該類型的所有信息。
獲取給定類型的Type引用有3種常用方式:
●使用 C# typeof 運算符。已知類型
Type t = typeof(string);
●使用對象GetType()方法。 已知對象
string s = "grayworm";
Type t = s.GetType();
●還可以調用Type類的靜態方殲盯胡法GetType()。已知類名
Type t = Type.GetType("System.String");
反射生成的對象
1.用Type構建對象
用構造函數動態生成對象:
既然有反射 那就有「正射」
對比一下:
有一個class Test 有無參構造方法
獲取實例的比較:
「正」 :由類名直接使用關鍵字new來獲得 語法:new Test()
反射:未知類名 運行時獲得類型名:例如:Type type = Type.GetType("Test");
Object o = type.GetConstructor (new Type[]{}).Invoke (null);
當然參數也可以由配置文件獲得
以上調用無參構造 帶參的構造怎麼調用呢?
2.用Activator生成對象:
Type t = typeof(NewClassw);
//構造函數的參數
object[] obj = new object[2] { "實參1", "實參2" };
//用Activator的CreateInstance靜態方法,生成新對象
object o = Activator.CreateInstance(t,obj);
3.Assembly生成對象:
Assembly assembly = Assembly.Load ("ReflectTest");
Object obj = assembly.CreateInstance ("ReflectTest.Wood");
反射獲取欄位值
一般用於已知對象時使用
同樣用正反來做對比:
已知對象MyClass obj
對象內有name這個欄位
正:
obj.name = "xxx"即可設置該對象的值
obj.name即可獲得該對象的值
反射:
//獲取類的描述對象
Type t = obj.GetType();
//取得欄位描述對象
FieldInfo fi = t.GetField("name");
//獲取或設置欄位值
fi.SetValue(obj, "k001");
fi.GetValue(obj);
一般在C#中以屬性替代欄位
//獲取類的描述對象
Type t = obj.GetType();
//取得屬性描述對象
PropertyInfo pi1 = t.GetProperty("Name");
//獲取或設置屬性值
pi1.SetValue(obj, "k001",null);
pi1.GetValue(obj,null);
反射執行方法
一般用於對象、方法名、參數類型已知
對象:obj
方法名:methodName
參數類型 String int
正:
直接給予參數調用:obj.methodName("實參1",實參2(int))
反射:
//獲取類的描述對象
Type t = obj.GetType();
//取得方法描述對象
MethodInfo mi = t.GetMethod("show");
//調用方法
mi.Invoke(obj, "實參1",實參2(int));
參數可以換成數組
動態載入程序集
System.Reflection.Assembly類
Assembly類可以獲得程序集的信息,也可以動態的載入程序集,以及在程序集中查找類型信息,並創建該類型的實例。
使用Assembly類可以降低程序集之間的耦合,有利於軟體結構的合理化。
通過程序集名稱返回Assembly對象
Assembly ass = Assembly.Load("ClassLibrary831");
通過DLL文件名稱返回Assembly對象
Assembly ass = Assembly.LoadFrom("ClassLibrary831.dll");
通過Assembly獲取程序集中類
Type t = ass.GetType("ClassLibrary831.NewClass"); //參數必須是類的全名
通過Assembly獲取程序集中所有的類
Type[] t = ass.GetTypes();
//通過程序集的名稱反射
Assembly ass = Assembly.Load("ClassLibrary831");
Type t = ass.GetType("ClassLibrary831.NewClass");
object o = Activator.CreateInstance(t, "", "");
MethodInfo mi = t.GetMethod("show");
mi.Invoke(o, null);
//通過DLL文件全名反射其中的所有類型
Assembly assembly = Assembly.LoadFrom("xxx.dll的路徑");
Type[] aa = a.GetTypes();
foreach(Type t in aa)
{
if(t.FullName == "a.b.c")
{
object o = Activator.CreateInstance(t);
}
}
小結
反射屬於面向對象的動態補充
讓C#的面向對象做到"所見即所得"
❽ 概述反射和序列化
反啟正緩射和序列化是不同的。
反射:程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對象。您可以使用反射動態地創建類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。然後,可以調用類型的方法或訪問其欄位和屬性
序列化:序列化是將對象轉換為容易傳輸的格式的過程。例如,可以序列化一個對象,然後使用 HTTP 通過 Internet 在客戶悄模端和伺服器之間傳輸該對象。清尺在另一端,反序列化將從該流重新構造對象。