反射是什么?
一种可以通过类名进行对象的实例化或者通过成员的名字操作类的成员的机制。
反射的应用场景:
当需要实例化一个新的类时,想要不修改源代码来添加,则可以在代码中通过反射用类名实例化类,然后通过修改配置文件灵活地实例化新的类。
反射实例化类
假设用反射获取 Person 类
1 //获取类的 Type 类型的值,若类有命名空间,要在类前面补充完整的命名空间 2 Type t= Type.GetType("Reflect.Person"); 3 //实例化类 4 5 //1.用 public权限 的 动态 的 无参构造 实例化 6 //Activator.CreateInstance(t); 7 8 //2.用 任何权限 的 动态 的 无参构造 实例化 9 //Activator.CreateInstance(t,true); 10 11 //3.用 public权限 的 动态 的 有参构造 实例化,传入的实参类型跟有参构造的参数列表一样 12 //Activator.CreateInstance(t,1,2); 13 14 //4.用 任何权限 的 静态或动态 的 有或无参构造 实例化,最常用的方法 15 // BindingFlags.NonPublic 设置为任何权限,BindingFlags.Static设置为静态方法 , new object[] {1,2} 有参构造的实参 16 // Activator.CreateInstance(t,BindingFlags.NonPublic | BindingFlags.Static,null,new object[] { 1},null);
反射操作类的字段
假设 Person 类里有一个字段 a
1 Type t= Type.GetType("Reflect.Person"); 2 3 object obj = Activator.CreateInstance(t); 4 5 // 动态字段的操作方法 6 /* FieldInfo a = t.GetField("a",BindingFlags.NonPublic | BindingFlags.Instance); 7 a.SetValue(obj,1); 8 a.GetValue(obj);*/ 9 10 // 静态字段的操作方法 11 /*FieldInfo b = t.GetField("a", BindingFlags.NonPublic | BindingFlags.Static); 12 b.SetValue(null, 1); 13 b.GetValue(null);*/
反射操作类的方法
假设 Person 类里有一个方法,名为 show,形参为 int a,int b
1 Type t = Type.GetType("Reflect.Person"); 2 3 object obj = Activator.CreateInstance(t); 4 5 // Type 数组里的元素为 反射方法的参数列表的数据类型的 Type 值 6 MethodInfo m = t.GetMethod("show",BindingFlags.NonPublic | BindingFlags.Instance,null,new Type[]{typeof(int),typeof(int) },null); 7 8 // 若是动态方法,第一个参数为 obj ,否则为 null。第二个参数为实参 9 // 若有返回值,用 object 类型的变量 接收 10 object result = m.Invoke(obj,new object[] { 1,2});
浙公网安备 33010602011771号