最近我和一位同事讨论了C++并且遗憾地说,没有办法用类字段的名字取一个字符串并用该名称提取字段; 换句话说,它缺乏反思.他给了我一个莫名其妙的表情,并询问何时有人需要做这样的事情.
除了"嘿,我现在需要立即行动"之外,我的头脑中没有一个好的答案.所以我坐下来想出了一些我用各种语言反射实际完成的事情.不幸的是,我的大多数例子来自我在Python中的Web编程,我希望这里的人会有更多的例子.这是我提出的清单:
给定一个包含
x ="Hello World!" 等行的配置文件
y = 5.0
动态设置某个config
对象的字段等于该文件中的值.(这是我希望我能用C++做的,但实际上做不到.)
排序对象列表时,根据配置文件或Web请求中属性名称的任意属性进行排序.
编写使用网络协议的软件时,反射允许您根据该协议的字符串值调用方法.例如,我编写了一个IRC机器人,它将转换
!some_command arg1 arg2
为方法调用actions.some_command(arg1, arg2)
并打印返回IRC通道的任何函数.
当使用Python的__getattr__函数(类似于Ruby/Smalltalk中的method_missing)时,我正在使用一个包含大量统计信息的类,例如late_total.对于每个统计数据,我希望能够添加_percent以将该统计数据作为我计算的总数的百分比(例如,stats.late_total_percent).反思使这很容易.
那么这里的任何人都可以从他们自己的编程经验中给出任何反映有用的例子吗?下一次同事问我为什么"想要做那样的事情"我想做好准备.
我可以列出以下反射用法:
后期绑定
安全性(内省代码出于安全原因)
代码分析
动态打字(没有反射就不可能打字)
元编程
从我的个人经历中反思的一些现实世界:
开发基于反射的插件系统
使用面向方面的编程模型
执行静态代码分析
使用了各种依赖注入框架
...
反思是好事:)