.NET 反射(Reflection)是指在运行时动态地检查、访问和修改程序集中的类型、成员和对象的能力。通过反射,你可以在运行时获取类型的信息、调用方法、访问字段和属性,以及创建对象实例,而无需在编译时知道这些类型的具体信息。
换句话说,反射可以在类的内部成员不能够直接访问的时候(比如private的时候),我们可以通过反射绕过成员的访问修饰符达到访问内部成员的效果。
1.自定义一个MyClass类,添加内部private字段和方法,用于案例测试。
public class MyClass
{
private int MyProperty = 10;
private void MyMethod(string message)
{
Console.WriteLine("MyMethod called with message: " + message);
}
}
2.在控制台主程序中,直接通过反射访问MyClass类中的私有字段和方法,达到绕过访问修饰符直接访问类内部成员的效果。
//获取类型信息
Type myClassType = typeof(MyClass);
//创建MyClass实例
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);
//设置私有字段的值
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!" });
}
测试案例通过,成功通过反射绕过成员访问修饰符,直接访问了类的内部成员