网友心得 说说.NET中的反射(转帖)

  反射是个很有趣的东西。而有趣的东西,大都可以展开联想,可以海阔开空。
  西游记中,孙猴子会七十二变。反射好像也可以。
  神笔马良笔下,万物复活,呵呵,反射有时候就是那只笔。
  第一次接触Java时,最令我惊讶的是它的反射。
  第一次接触.NET时,又见反射。
  正所谓,一回生,二回熟,不再大惊小怪之后,似乎应该仔细想一想了。
  说半天,反射究竟是啥?
  歪一下头,闭上眼,仔细想想,再想想……
  反射,运行中枚举程序结构,执行时生成的无需编译的代码。
  我绞尽脑汁,能想到的描述方式,就这样了。   
  没明白?饿的神啦!
  丑陋的老巫婆开始念起咒语:
  我要变成一个美女。我要去参加超级女声……
  她没有去美容院,也没有去参加超女,在一面魔镜的反射下,在偶们面前出现了一个美女。
  好了,说正经的。没啥条理,按反射的各项功能,我来说说可能的,有趣和无趣的一些应用。

一:枚举程序结构。
  嗯,就是在运行的时候,查出一些代码级的东东。
  .NET中,从当前应用程序域开始,通过反射,可以枚举出所有程序集(分发包),然后呢,在程序集中,可以枚举出所有模块(DLL或exe级) ,模块中,枚举出所有类型(Class),类型中,枚举出所有成员(属性,方法等……),或是接口、嵌套类,在方法((构造器,属性,事件)中,枚举出中的所有参数。
  应该没头晕,这很简单,最后,一句话,.NET程序的大体框架都可以通过反射来得到。
  说说用处。

1.1:反编译IL语言

  是了,你当然用过ILDasm这个.NET的IL语言反编译工具。
    实际上,装载程序后(.NET中可以指定装载程序集),通过反射,结合公开的托管模块和程序集的格式进行方法的IL代码分析,你可以完成定制你自已的反编译工具。当然,是否有意义,或许只是写出来炫一炫,或是加深某此方面知识的理解。

1.2:设计器(或其它场景),动态提供类型的特性
  在类似Visal Studio的设计器中,对于Form设计器的UI单元,通过反反射,可以枚举其属性,方法,事件……,当然,你可以通过扩充数据结构来实现,但如果用反射,你的代码会更简洁,更没有数据冗余,扩展性更好,设计思路也更清哳,有人说,代码就是最好的设计文档。将代码直接反射到应用,在设计上看,显然是最高效的。

1.3:提供感知编码
  在VB和一些高级开发语言中,利用COM的typelib来实现感知编码(动态枚举COM接口的方法,属性,事件)。如今,有了反射,有了.NET的元数据,COM的TypeLib方式就显得过于多余而繁杂了。反射可以将其轻松搞定。

二:动态执行代码。
  反射,可以根据运行时提供的字串,动态生成类型实例,动态执行指定方法。
  话虽短,意义在。我们来说说它可能的衍生。

2.1:程序晚绑定
  在Win32中,我们曾用Loadlibrary和GetProcAddress来进行调用方法晚绑定。
  反射有些类似于晚绑定。晚绑定的好处呢,显示加载程序集,构造类型实例,调用方法,或许用到分析程序结构方面。
2.2:设计模式与反射
  更进一步,在设计模式中,我们喜欢用工厂方法来构建实例,用抽象工厂来抽象工厂的子类。有命令模式来执行命令,用Builder模式来生成不同的实体。这些,其实都可以用反射来简化(具体方法,就不写了哈)。
  当然,选择这前要注意,你可能会以损失掉一些性能为代价。

2.3:序列化。
  MFC中有序列化,但它并未提供任何指导,也很不方便进行扩展。有了反射的帮忙,序列化时的字段枚举变得简单,反序列化时的对象生成也轻而易举。当然,在FCL中已将相关应用封存,很多时候,你感受不到反射为你带来的好处。

2.4:异构系统中的通讯
  DCOM支持的三层架构带来了Windows的上一轮繁荣。但相关的部署升级,包括其内部实现原理的复杂性,总让人总是挠头。外加Java J2EE的重压下,.NET进行了改进。
  .NET中提供了全新远程通讯方式(Remoting),提供了强大的Web支持(Web XML)。据说,其中都大量应用到反射。这点,俺还没时间去仔细查看,估计是在列集和反列集上使用到反射。当然,肯定还有好多好多新东东,俺还没时间去看。
  不过,偶以前倒是接触到一个在异构系统中对反射的简单应用。
  很简单,客户端通过Web browser中的html,用http最简单的Post发送命令(定制的XML格式)程序,在服务器端对XML解析,实际上就是指定程序集,指定类型的指定调用。这样,客户端并不需要安装任何类型,只需存在指定格式的代码生成,一个穿越防火墙的系统就实现了,其中关键,仍然是反射。

2.5:特珠情况下的特殊应用
  在一些特殊的场合,反射还有一些特殊的作用。比如,有本书上举了个例子,用静态类来进行委托的绑定,而代码需要主动的去触发静态类的Static构造函数,无它法,可以通过反射(CreateInstance)来实现。  
  大概就这些了,如果看到新的东东,再补充。

posted @ 2007-03-20 13:36  ejiyuan  阅读(324)  评论(0编辑  收藏  举报