JPC*_*sta 17 reflection metaprogramming definition
什么是反射?我阅读了关于这个主题的维基百科文章,我理解它是一种元编程,程序可以在运行时自行修改,但这意味着什么?在什么样的情况下这是一个好的方法,何时最好使用它?
Con*_*lls 24
Reflection是一个工具,您可以在运行时查询对象的属性.例如,Python,Java和.Net具有可以找到对象的实例变量或方法的工具.
用于反射的应用的示例是O/R映射层.有些人使用反射通过在运行时查询其属性并动态填充实例来构造对象.这允许您基于来自某种数据字典的元数据以编程方式执行此操作,而无需重新编译应用程序.
举一个简单的例子,我将使用Python,因为它的反射工具使用起来非常简单,并且比java或.Net的反射设备更少.
ActivePython 2.5.2.2 (ActiveState Software Inc.) based on
Python 2.5.2 (r252:60911, Mar 27 2008, 17:57:18) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class foo:
... def __init__(self):
... self.x = 1
...
>>> xx = foo() # Creates an object and runs the constructor
>>> xx.__dict__ # System metadata about the object
{'x': 1}
>>> a = xx.__dict__ # Now we manipulate the object through
>>> a['y'] = 2 # its metadata ...
>>> print xx.y # ... and suddenly it has a new instance variable
2
>>>
Run Code Online (Sandbox Code Playgroud)
现在,我们使用基本反射来检查任意对象的实例变量.__dict__Python上的特殊变量是一个对象的系统属性,该对象具有由变量(或方法)名称键入的成员的哈希表.我们已经反思地检查了对象并使用反射工具人工地将第二个实例变量放入其中,然后我们可以通过将其作为实例变量来显示它.
请注意,这个特殊技巧不适用于Java或.Net,因为实例变量是固定的.这些语言的类型系统不允许在运行时以python的'duck'类型系统的方式添加新的实例变量.但是,您可以反射性地更新在类型定义中声明的实例变量的值.
您还可以使用反射来动态构造方法调用并执行各种其他巧妙的技巧,例如基于参数实例化对象.例如,如果您有某种基于插件的系统,其中某些功能是可选的,您可以使用反射来查询插件有关它提供的服务(可能通过查询是否实现了某些接口),而无需显式元数据.
许多动态语言接口(如OLE自动化)使用反射作为接口的组成部分.
Jon*_*eet 20
它不是在执行时修改代码,而是检查对象并要求它们在不知道静态类型的情况下执行代码.
描述它的一种简单方法是"使一种静态类型语言动态表现的一种有点痛苦的方法".
编辑:用途:
SubmitButton_Click和ASP.NET会附上方法的处理程序SubmitButton的Click事件(如果你有自动连接打开)这是个好主意吗?好吧,只有当替代品很痛苦时.我喜欢静态打字,但它不会妨碍 - 然后你会获得很多编译时的好处,而且它也会更快.但是当你确实需要它时,反射可以让你做各种其他事情,否则是不可能的.