新網(wǎng)站做seo地方網(wǎng)站建設(shè)
文章目錄
- 一.概念:
- 二.反射的作用:
- 三.代碼案例:
- 四.運(yùn)行結(jié)果:
一.概念:
.NET 反射(Reflection)是指在運(yùn)行時(shí)動(dòng)態(tài)地檢查、訪問和修改程序集中的類型、成員和對(duì)象的能力。通過反射,你可以在運(yùn)行時(shí)獲取類型的信息、調(diào)用方法、訪問字段和屬性,以及創(chuàng)建對(duì)象實(shí)例,而無需在編譯時(shí)知道這些類型的具體信息。
二.反射的作用:
換句話說,反射可以在類的內(nèi)部成員不能夠直接訪問的時(shí)候(比如private的時(shí)候),我們可以通過反射繞過成員的訪問修飾符達(dá)到訪問內(nèi)部成員的效果。
三.代碼案例:
1.自定義一個(gè)MyClass類,添加內(nèi)部private字段和方法,用于案例測試。
public class MyClass
{private int MyProperty = 10;private void MyMethod(string message){Console.WriteLine("MyMethod called with message: " + message);}
}
2.在控制臺(tái)主程序中,直接通過反射訪問MyClass類中的私有字段和方法,達(dá)到繞過訪問修飾符直接訪問類內(nèi)部成員的效果。
//獲取類型信息
Type myClassType = typeof(MyClass);
//創(chuàng)建MyClass實(shí)例
var myClassInstance = Activator.CreateInstance(myClassType);string Key = "MyProperty";//獲取私有字段
FieldInfo privateFiledInfo = myClassType.GetField(Key, BindingFlags.NonPublic | BindingFlags.Instance);
if (privateFiledInfo != null)
{int filedValue = (int)privateFiledInfo.GetValue(myClassInstance);Console.WriteLine("私有字段值為:"+filedValue);//設(shè)置私有字段的值privateFiledInfo.SetValue(myClassInstance, 20);Console.WriteLine("修改后私有字段的值為:"+(int)privateFiledInfo.GetValue(myClassInstance));
}MethodInfo privateMethodInfo = myClassType.GetMethod("MyMethod", BindingFlags.NonPublic | BindingFlags.Instance);
if (privateMethodInfo != null)
{privateMethodInfo.Invoke(myClassInstance,new object[] { "Hello,Reflection!" });
}
四.運(yùn)行結(jié)果:
測試案例通過,成功通過反射繞過成員訪問修飾符,直接訪問了類的內(nèi)部成員