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 这样的图像系统。
在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 这样的图像系统。