静态语言和反射

时间:2013-08-09 17:48:06

标签: java reflection dynamic-programming language-features

据我所知和理解,

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

来自维基百科:

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

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

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

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

提前致谢!

1 个答案:

答案 0 :(得分:4)

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

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

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

<强>更新

换句话说回答:

  

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

......反射不依赖于evel能力。这些是两种不同的语言功能。

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