6

据我所知和理解,

反射是在运行时创建/修改源代码的能力。

来自维基百科:

  • 在运行时发现和修改源代码结构(例如代码块、类、方法、协议等)作为第一类对象。
  • 将与类或函数的符号名称匹配的字符串转换为对该类或函数的引用或调用。
  • 在运行时评估一个字符串,就好像它是一个源代码语句。
    为语言的字节码创建一个新的解释器,为编程结构赋予新的
    意义或目的。

动态语言是我们可以在运行时评估(直接从字符串评估)的语言。

来自维基百科:“通过添加新代码、扩展对象和定义或修改类型系统来扩展程序”

好的,现在,我的问题是:静态语言(没有 eval 能力)如何进行反射(例如 Java)?(新的源代码不评估?:/)

提前致谢!

4

1 回答 1

4

我认为维基百科的解释并不是很好。

反射(或自省)不是关于在运行时创建代码,而是关于代码在运行时反映自身的能力(并基于此修改其行为)。示例将获取有关对象类型的信息(如 C++ 中的 RTTI)或获取与对象关联的元数据(如 Java 中的注释)。

运行时代码生成更多地与第一类相关而不是反射,所以我认为当前的维基百科文章有点误导。

更新

换句话说,回答这个问题:

好的,现在,我的问题是,静态语言(没有 eval 能力)怎么能有反射(例如 Java)?

......将是反射不依赖于水平能力。这是 2 个独立的语言功能。

而且,正如 Giulio Franco 在评论中指出的那样 - Java 能够运行时代码生成\操作(例如,参见CGLIB )。

于 2013-08-09T18:29:20.850 回答