反射
反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法;這種動態擷取的以及動態調用對象的方法的功能稱為反射機制。反射機制動態擷取方法並使用方法和自己直接建立一個類的對象去直接調用時完全不一樣的。比如一個類裡面有一個屬性為private的屬性或者方法,我們是不能直接去調用的,但是可以使用反射機制去動態調用。
IOC
IOC最大的好處是把對象產生放在了XML裡定義,所以當我們需要換一個實現子類將會變成很簡單(一般這樣的對象都是實現於某種介面的),只要修改XML就可以了,這樣我們甚至可以實現對象的熱插撥(有點象USB介面和SCSI硬碟了)。在不適用IOC之前一個對象如果依賴於另一個對象(後面我們簡稱依賴對象和被依賴對象),我們要在依賴對象中執行個體化一個被依賴對象,這樣才能調用被依賴對象中的方法。顯然這樣耦合度比較高,不符合我們編程的原則。因此這時候我們就會引入一個第三方對象,它負責給依賴對象直接輸送一個被依賴對象,降低二者之間的耦合性。是加入IOC容器前後,系統中對象耦合度的對比
軟體系統在沒有引入IOC容器之前,1所示,對象A依賴於對象B,那麼對象A在初始化或者運行到某一點的時候,自己必須主動去建立對象B或者使用已經建立的對象B。無論是建立還是使用對象B,控制權都在自己手上。
軟體系統在引入IOC容器之後,這種情形就完全改變了,2所示,由於IOC容器的加入,對象A與對象B之間失去了直接聯絡,所以,當對象A運行到需要對象B的時候,IOC容器會主動建立一個對象B注入到對象A需要的地方。
通過前後的對比,我們不難看出來:對象A獲得依賴對象B的過程,由主動行為變為了被動行為,控制權顛倒過來了,這就是“控制反轉”這個名稱的由來。
執行個體
反射執行個體代碼
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace StudentDAL{ public class Student { //屬性 public string Name{get;set;} public int Age { get; set; } //無參數建構函式 public Student() { this.Name = "無參數"; this.Age = 0; } //有參數建構函式 public Student(string name, int age) { this.Name = "name"; this.Age = age; } //public帶參帶傳回值函數 public string PublishMethodReturn() { return string.Format("我叫"+Name+"年齡" +Age); } }}</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Reflection;namespace ITOO_Reflection{ class Program { static void Main(string[] args) { //使用 Assembly 定義和載入程式集, //載入在資訊清單中列出的模組, //以及從此程式集中尋找類型並建立該類型的執行個體. //擷取程式集 Assembly assembly = Assembly.Load("StudentDAL"); //從程式及擷取指定物件類型 Type type = assembly.GetType("StudentDAL.Student"); var instance = assembly.CreateInstance("StudentDAL.Student"); //為學生類的屬性賦值 type.GetProperty("Name").SetValue(instance, "shx", null); type.GetProperty("Age").SetValue(instance, 18, null); //擷取Student類的方法 var method = type.GetMethod("PublishMethodReturn"); //調用Student類的成員方法PublishMethodReturn var S= method.Invoke(instance, null); Console.WriteLine(S); Console.Read(); } }}</strong></span>
運行結果
IOC執行個體代碼
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ITOO.IOC.IDAL{ public interface IUserDal { void HelloWord(); }}</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;using System.Collections.Generic;using System.Linq;using System.Text;using ITOO.IOC.IDAL;namespace ITOO.IOC.DAL{ public class User:IUserDal { public void HelloWord() { Console.WriteLine("helloword"); } }}</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ITOO.IOC.IBLL{ public interface IUserBll { void HelloWord(); }}</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;using System.Collections.Generic;using System.Linq;using System.Text;using ITOO.IOC.IBLL;using ITOO.IOC.IDAL;using ITOO.Library.Core.AOP;namespace ITOO.IOC.BLL{ public class UserBll:IUserBll { public void HelloWord() { //使用底層封裝的SpringHelper從IOC容器中拿到D層的類的對象執行個體 IUserDal iuser = SpringHelper.GetObject<IUserDal>("User"); iuser.HelloWord(); } }}</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System;using System.Collections.Generic;using System.Linq;using System.Text;using ITOO.IOC.IBLL;using ITOO.Library.Core.AOP;namespace ITOO.IOC.Client{ class Program { static void Main(string[] args) { //用戶端通過底層封裝的SpringHelper從IOC容器中根據B層類的對象的id拿到UserBll類的執行個體 IUserBll iuserbll = SpringHelper.GetObject<IUserBll>("UserBll"); //調用UserBll類的方法 iuserbll.HelloWord(); Console.Read(); } }}</strong></span>
運行結果
以上就是反射與IOC的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!