黑马程序员技术交流社区
标题:
求通俗讲解反射
[打印本页]
作者:
韩继新
时间:
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关键字
最利害的是可以直接使用类中的私有字段,方法等
<div class="blockcode"><blockquote>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace 反射1
{
class Program
{
class People
{
private string name="李斯";
private void Say()
{
Console.WriteLine("hello"+name);
}
}
static void Main(string[] args)
{
Type typ = typeof(People);
//反射出name字段
FieldInfo fi = typ.GetField("name",BindingFlags.Instance|BindingFlags.NonPublic);
//反射出Say()方法
MethodInfo me = typ.GetMethod("Say",BindingFlags.Instance|BindingFlags.NonPublic);
//创建obj实例
object obj = Activator.CreateInstance(typ);
//设置name字段
fi.SetValue(obj,"张三");
//调用Say()方法
me.Invoke(obj,new object[]{}); //打印出结果 hello张三
Console.ReadKey();
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2