Reflection 反射用例 最近我和一位C++的同事谈过,哀叹没有办法用类字段的名字来取一个字符串,并用那个名字提取字段。换句话说,它缺乏反思。他困惑地看了我一眼,问什么时候会有人需要做这样的事情

Reflection 反射用例 最近我和一位C++的同事谈过,哀叹没有办法用类字段的名字来取一个字符串,并用那个名字提取字段。换句话说,它缺乏反思。他困惑地看了我一眼,问什么时候会有人需要做这样的事情,reflection,Reflection,我脑子里除了“嘿,我现在就要做”之外,没有给他一个好的答案。所以我坐下来,列出了一些我用各种语言实际做过的关于反射的事情。不幸的是,我的大多数示例都来自于Python的web编程,我希望这里的人会有更多的示例。下面是我列出的清单: 给定一个配置文件,其行如 x=“你好,世界!” y=5.0 动态地将某些config对象的字段设置为该文件中的值。(这是我希望在C++中能做的,但实际上不能做。)< /P> 对对象列表进行排序时,请根据配置文件或web请求中给定属性名称的任意属性进行排序 在编写使用

我脑子里除了“嘿,我现在就要做”之外,没有给他一个好的答案。所以我坐下来,列出了一些我用各种语言实际做过的关于反射的事情。不幸的是,我的大多数示例都来自于Python的web编程,我希望这里的人会有更多的示例。下面是我列出的清单:

  • 给定一个配置文件,其行如
    x=“你好,世界!”
    y=5.0
    动态地将某些
    config
    对象的字段设置为该文件中的值。(这是我希望在C++中能做的,但实际上不能做。)< /P>
  • 对对象列表进行排序时,请根据配置文件或web请求中给定属性名称的任意属性进行排序

  • 在编写使用网络协议的软件时,反射允许您根据该协议中的字符串值调用方法。例如,我编写了一个IRC bot,可以翻译
    !某些命令arg1 arg2

    进入一个方法调用
    actions.some_命令(arg1,arg2)
    并打印该函数返回到IRC通道的任何内容

  • 当使用Python的uuu getattr_uuu函数(类似于Ruby/Smalltalk中缺少的方法)时,我使用的是一个包含大量统计信息的类,比如late_total。对于每一个统计数据,我都希望能够加上_%以得到统计数据占我统计的总数据的百分比(例如,stats.late _total _%)。反思使这很容易


  • 因此,这里的任何人都可以从他们自己的编程经验中举出一些例子来说明反思是有帮助的吗?下次当同事问我为什么要“做那样的事情”时,我想做更多的准备。

    有很多次你想动态实例化和处理直到运行时才知道类型的对象。例如,使用或映射器或插件架构。如果您想编写日志库并动态地检查异常的类型和属性,模拟框架可以使用它


    如果我想得久一点,我可能会想出更多的例子。

    写调度员。Twisted使用python的反射功能来调度XML-RPC和SOAP调用。RMI使用Java的反射api进行调度

    命令行解析。基于传入的命令行参数构建配置对象

    在编写单元测试时,使用反射可能会很有帮助,尽管我主要是使用反射来绕过访问修饰符(Java)。

    我在C#中使用反射,当时框架或第三方库中有一些内部或私有方法需要访问


    (免责声明:这不一定是最佳实践,因为在以后的版本中可能会更改私有和内部方法。但它满足了我的需要。)

    好吧,在静态类型语言中,在需要执行“动态”操作的任何时候,都可以使用反射。它对于工具化(扫描对象的成员)非常方便。在Java中,它经常用于JMX和动态代理。而且有很多一次性的情况下,它确实是唯一的方法(几乎在任何时候你需要做编译器不允许你做的事情)。

    我使用反射来获取异常、日志等的当前方法信息

    string src = MethodInfo.GetCurrentMethod().ToString();
    string msg = "Big Mistake";
    Exception newEx = new Exception(msg, ex);
    newEx.Source = src;
    
    而不是

    string src = "MyMethod";
    string msg = "Big MistakeA";
    Exception newEx = new Exception(msg, ex);
    newEx.Source = src;
    

    复制/粘贴继承和代码生成更容易。

    我现在的情况是,有一个XML流通过网络传入,我需要实例化一个实体对象,它将从流中的元素填充自己。使用反射来确定哪个实体对象可以处理哪个XML元素比编写一个庞大的、维护噩梦般的条件语句更容易。XML模式和我如何构造和命名对象之间显然存在依赖关系,但我控制这两者,所以这不是什么大问题

    我可以列出以下用法进行反思:

    • 后期装订
    • 安全性(出于安全原因的内省代码)
    • 代码分析
    • 动态类型(如果没有反射,鸭子类型是不可能的)
    • 元编程
    根据我的个人经验,一些真实世界的反射用法:

    • 基于反射的插件系统开发
    • 使用面向方面的编程模型
    • 执行静态代码分析
    • 使用了各种依赖注入框架

    反射是件好事:)

    如果输入数据(如xml)具有复杂的结构,很容易映射到对象实例,或者我需要实例之间的某种“是”关系,我发现反射非常有用

    由于反射在java中相对容易,所以我有时将其用于简单数据(键值映射),其中我有一组固定的小键值。一方面,确定键是否有效很简单(如果类具有setter setKey(字符串数据)),另一方面,我可以更改(文本)输入数据的类型并隐藏转换(例如getKey()中的simple cast to int),因此应用程序的其余部分可以依赖正确类型的数据。
    如果某个对象的某个键值对的类型发生了变化(例如,formint变为float),我只需在数据对象及其用户中对其进行更改,但也不必记住检查解析器。如果性能是一个问题,这可能不是一个明智的方法…

    我通常使用反射进行调试。反射比各种打印语句更容易、更准确地显示系统中的对象。用多种语言