zoukankan      html  css  js  c++  java
  • 网友心得 说说.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)来实现。  
      大概就这些了,如果看到新的东东,再补充。

  • 相关阅读:
    LVS基于DR模式负载均衡的配置
    Linux源码安装mysql 5.6.12 (cmake编译)
    HOSt ip is not allowed to connect to this MySql server
    zoj 3229 Shoot the Bullet(无源汇上下界最大流)
    hdu 3987 Harry Potter and the Forbidden Forest 求割边最少的最小割
    poj 2391 Ombrophobic Bovines(最大流+floyd+二分)
    URAL 1430 Crime and Punishment
    hdu 2048 神、上帝以及老天爷(错排)
    hdu 3367 Pseudoforest(最大生成树)
    FOJ 1683 纪念SlingShot(矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/ejiyuan/p/681071.html
Copyright © 2011-2022 走看看