introspection 与 reflection

其实一直我也没弄清楚这两个玩意确切的定义,但是在学习 beanutils 的时候看见下面这个说法:

The BeanUtils package relies on introspection rather than reflection. This means that it will find only JavaBean compliant properties.

这也导致我不得不搞清楚这两者到底是啥。我们首先看看 wiki 上前者的定义说法

In computing, type introspection is the ability for a program to examine the type or properties of an object at runtime.

看起来就是说你知道某个对象之后还能问这个玩意它有什么属性、是什么类型。这和编译时的区别在于,如果你编译时就知道,往往直接通过这个对象名加上某些访问成员的运算(常见的就是点,比如你知道对象 a 和属性 foo,就能写 a.foo 了)。那么通过 introspection 就是说你可以问这个对象你有哪些属性,或者问这个属性是你的吧,如 a.get (“foo”)。

对应的 reflection 的说法却是

reflection is the ability of a computer program to examine (see type introspection) and modify the structure and behavior (specifically the values, meta-data, properties and functions) of an object at runtime.

由此可见,reflection 是除了 introspection 以外还有别的能够操纵或者修改程序自己的能力。其实 reflection 在比较原始的汇编里面却是最容易做到的,

The earliest computers were programmed in their native assembly language, which were inherently reflective as these original architectures could be programmed by defining instructions as data and using self-modifying code. As programming moved to higher level languages such as C, this reflective ability disappeared (outside of malware) until programming languages with reflection built in to their type systems appeared.

一般支持 reflection 的语言会提供

  • 发现、更改源代码的指令
  • 将字符串映射成为某些类或者函数的指令,即转换后能将其类似类或者函数一样调用
  • 运行时将给定的字符串执行
  • 提供 interpreter

像 Java 大概主要是第二点,多数脚本/动态语言似乎都有这些机制。使用 reflection 主要的问题在于效率(某些优化可能不能做了)、安全性(如 applet 运行环境不允许)、违背了 OO 的封装(内部的变量都暴露了出来)。

回到原来的问题上,BeanUtils 其实就是利用了 java.beans 一些工具,如 Introspector,这些仅仅是将 bean 的属性罗列出来,而没有使用更高级的一些操作。不过一直很好奇 java 一定要弄个 setter/getter 而不直接弄成 public member 到底有什么好处… 除了让 code 看起来冗余度更高一些么?可能有空要好好看看这方面的东西了。

——————-
And the servant told Isaac all things that he had done.

Advertisements
introspection 与 reflection

一个有关“introspection 与 reflection”的想法

  1. guojc 说:

    setter可以做检查吧。 getter的对象可能计算得到的。 这方面我觉得scala比较好,member和getter/setter可以代码级兼容,不用改code就由member变getter/setter,但还是要重编译。

    1. zt 说:

      你是不是逢人就说 scala 多好啊,前几天有人开玩笑说要玩 erlang… 囧死了

      不过这边用 ruby on rails 的比 django 多

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s