java - 静态语言和反射

标签 java reflection dynamic-programming language-features

据我所知,

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

来自维基百科:

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

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

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

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

提前致谢!

最佳答案

我认为维基百科的解释措辞不太好。

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

运行时代码生成与一流的关系比与反射的关系更大,因此我认为当前的维基百科文章有点误导。

更新

换句话说就是回答这个问题:

Ok, now, my question is, how can static language (without eval ability) can have reflection (e.g Java)?

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

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

关于java - 静态语言和反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18152654/

相关文章:

algorithm - 如何计算具有特定属性的大 A 和 B 之间的整数?

algorithm - 使用动态规划时,捕获整个路径以获得最小和?

java - Apache Flume/var/log/flume-ng/flume.log(权限被拒绝)

java - 确定 Java 语言功能是否在特定的 Android SDK(平台)中可用

java - 将通用事件传递给 Guava EventBus?

java - 如何检查 Class<?> 对象实例的 "?"是否为 SomeInterface

javascript - 带重复的背包 - 阵列解决方案

java - 找不到 RMI 注册表

java - spring websocket使整个项目返回404

ruby - 获取ruby中对象的方法