最近我在和一位同事谈论 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)。反射使这变得非常容易。
那么,这里的任何人都可以从他们自己的编程经验中举出任何例子,当时反射很有帮助吗?下一次同事问我为什么“曾经想做那样的事情”时,我想做好更多的准备。