据我所知和理解,
反射是在运行时创建/修改源代码的能力。
来自维基百科:
动态语言是我们可以在运行时评估(直接从字符串求值)的语言。
来自维基百科: “扩展程序,添加新代码,扩展对象和定义,或修改类型系统”
好的,现在,我的问题是: 静态语言(没有eval能力)如何具有反射(例如Java)? (新的源代码不评估?:/)
提前致谢!
答案 0 :(得分:4)
我认为维基百科的解释并不是很好。
反射(或内省)不是关于在运行时创建代码,而是关于代码在运行时反映自身的能力(并基于此修改它的行为)。示例将获取有关对象类型的信息(如C ++中的RTTI)或获取与对象关联的元数据(如Java中的注释)。
运行时代码生成与 first-classness 更相关,而不是反射,所以我认为当前的维基百科文章有点误导。
<强>更新强>
换句话说回答:
好的,现在,我的问题是,静态语言(没有eval能力)如何才能有反射(例如Java)?
......反射不依赖于evel能力。这些是两种不同的语言功能。
而且,正如Giulio Franco在评论中指出的那样 - Java能够运行代码生成\操作(例如,参见CGLIB)。