Groovy 元编程

Groovy Meta-Programming

在TCL中,可以在运行时拿到一个method/procedure的代码,修改后注入回来

这在 Groovy 中可行吗?我知道可以包装原始方法,但我(不幸地)猜测在 groovy 中,方法的源代码在运行时不可用,是吗?

示例:想象以下(不太好)示例

def someMethod() {
   //some complex code I don't have the source
   println "debug"
   //some more complex code
}

如果我现在想将 println 语句更改为 log 语句。我无法替换整个方法,因为我要么没有源代码,要么不想冒它在下一个版本中有所不同的风险,因此我会用旧源代码覆盖它。

感谢 Jayan,我现在知道这可以通过 AST 转换来处理,但在我看来它比应该的更复杂。

如果我可以通过元编程获取源代码并对其进行修改...

好的 - 我已经听到有人说我需要一个解析器来修改它,而这正是 AST 给我的 - 已经解析的代码。但老实说,我认为源代码上的简单正则表达式通常就足够了;-)

首先要澄清的事情: 运行时元编程意味着有一个自我修改的程序。它会在 运行 时自行改变。这通常是通过修改 meta class 来完成的。编译时元编程意味着在运行 编译器"extending" 之前修改程序。通常后者是用 AST 转换完成的。

Groovy 将字节码交给 JVM 执行。可能有也可能没有可用的源文件,但通常没有运行时结构来保留源代码。有一个从元 class 到 AST 的映射,但这基本上是在 class 路径上搜索合适的源文件并从中编译一个 AST。如果您无法获得该来源,则无法使用。

即使源可用,也不会给您想要的修改功能。需要编译一个新的 class,然后使用类似热交换的方法来替换 class。

Groovy 不是像 Smalltalk 这样的图像系统。