在TCL中,可以在运行时获取方法/过程的代码,修改它并将其注入。
这在Groovy中可行吗?我知道有可能包装原始方法,但我(不幸地)猜测在groovy中,方法的源在运行时不可用,是吗?
示例:想象以下(不太好)exmaple
def someMethod() {
//some complex code I don't have the source
println "debug"
//some more complex code
}
如果我现在想将println
语句更改为log
语句。我无法替换整个方法,因为我要么没有源代码,要么不想冒险在下一个版本中它有所不同,因此我会用较旧的源覆盖它。
Thanx to Jayan我现在知道这可能是通过AST转换来处理的,但在我看来它应该比应该更复杂。
如果我可以通过元编程获取源代码并修改它......
好的 - 我已经听过有人说我需要一个解析器来修改它,而这正是AST给我的 - 已经解析过的代码。但说实话,我认为源代码的简单正则表达式通常足够好; - )
答案 0 :(得分:2)
首先澄清事情: 运行时元编程意味着具有自修改程序。它在运行时会自行改变。这通常通过修改元类来完成。 Compiletime Metaprogramming意味着在程序运行之前通过"扩展"来修改程序。编译器。通常后者用AST变换完成。
Groovy将字节码提供给JVM来执行。可能有或没有可用的源文件,但通常没有运行时结构,它保留源。从元类到AST的映射,但这基本上在类路径上搜索拟合源文件并从中编译AST。如果您无法使用该来源,则无法使用。
即使源可用,也不会为您提供所需的修改功能。需要编译一个新类,然后使用hotswapping之类的东西来替换类。
Groovy不是像Smalltalk这样的图像系统。