Groovy元编程

时间:2015-07-04 07:30:04

标签: groovy metaprogramming

在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给我的 - 已经解析过的代码。但说实话,我认为源代码的简单正则表达式通常足够好; - )

1 个答案:

答案 0 :(得分:2)

首先澄清事情: 运行时元编程意味着具有自修改程序。它在运行时会自行改变。这通常通过修改元类来完成。 Compiletime Metaprogramming意味着在程序运行之前通过"扩展"来修改程序。编译器。通常后者用AST变换完成。

Groovy将字节码提供给JVM来执行。可能有或没有可用的源文件,但通常没有运行时结构,它保留源。从元类到AST的映射,但这基本上在类路径上搜索拟合源文件并从中编译AST。如果您无法使用该来源,则无法使用。

即使源可用,也不会为您提供所需的修改功能。需要编译一个新类,然后使用hotswapping之类的东西来替换类。

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