黑马程序员技术交流社区

标题: 求通俗讲解反射 [打印本页]

作者: 韩继新    时间: 2013-9-30 08:29
标题: 求通俗讲解反射
本帖最后由 韩继新 于 2013-10-1 19:13 编辑

网上看了些讲解反射的,写的好长,看完了还是不清楚反射是怎么回事?
希望可以通俗的给我讲解下,什么是反射、什么情况下用反射、反射有什么优点。最好加上简单易懂的小例子哦

作者: 曹伟    时间: 2013-9-30 08:52
本帖最后由 曹伟 于 2013-9-30 08:54 编辑

个人肤浅理解,
反射实际上就是得到程序集中的属性和方法
在设计模式中应该会用到反射技术实现步骤:
导入using System.Reflection;
Assembly.Load("程序集") //加载程序集,返回类型是一个Assembly
   foreach (Type type in assembly.GetTypes())
            {
                string t = type.Name;  //   得到程序集中所有类的名称
            }
Type type = assembly.GetType("程序集.类名");  //获取当前类的类型
Activator.CreateInstance(type);  //创建此类型实例
MethodInfo mInfo = type.GetMethod("方法名"); //获取当前方法
mInfo.Invoke(null,方法参数);  


作者: 于振发    时间: 2013-9-30 09:05
面向对象中存在一个封装的概念,也就是说,你需要构建一个封装体的实例(类或对象),然后呢,你才可以访问这个封装体封装的方法、属性等等,但是使用反射,你可以不需要构建这个封装体的实例,你就可以知道这个封装体是个什么类型的东西,并且可以看到这个封装体里面封装了什么样的方法、属性等等
作者: 段朝骞    时间: 2013-9-30 12:56
本帖最后由 段朝骞 于 2013-9-30 12:59 编辑

某位大神说过:反射就是操作元数据
通过反射可以读取封装类中的方法,属性等,可以不使用new关键字
最利害的是可以直接使用类中的私有字段,方法等
  1. <div class="blockcode"><blockquote>using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Reflection;

  6. namespace 反射1
  7. {
  8.     class Program
  9.     {
  10.         class People
  11.         {
  12.             private string name="李斯";
  13.             private void Say()
  14.             {
  15.                 Console.WriteLine("hello"+name);
  16.             }
  17.         }
  18.         static void Main(string[] args)
  19.         {
  20.             Type typ = typeof(People);
  21. //反射出name字段
  22.             FieldInfo fi = typ.GetField("name",BindingFlags.Instance|BindingFlags.NonPublic);  
  23. //反射出Say()方法
  24.             MethodInfo me = typ.GetMethod("Say",BindingFlags.Instance|BindingFlags.NonPublic);
  25. //创建obj实例
  26.             object obj = Activator.CreateInstance(typ);
  27. //设置name字段
  28.             fi.SetValue(obj,"张三");   
  29. //调用Say()方法
  30.             me.Invoke(obj,new object[]{}); //打印出结果 hello张三
  31.             Console.ReadKey();
  32.         }
  33.     }
  34. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2