在TCL中,可以在运行时获取方法/过程的代码,修改它并将其注入回。
这在Groovy中是可能的吗?我知道包装原始方法是可能的,但我(不幸地)猜测,在groovy中,方法的来源在运行时是不可用的,是吗?
试想一下下面的例子(不太好)
def someMethod() {
//some complex code I don't have the source
println "debug"
//some more complex code
}如果我现在想将println语句更改为log语句。我无法替换整个方法,因为我要么没有源代码,要么不想冒险在下一个版本中它是不同的,因此我会用旧的源代码覆盖它。
感谢Jayan,我现在意识到这可以通过AST转换来处理,但在我看来,它比应该的要复杂得多。
如果我能通过元编程得到源代码并修改它.
好的--我已经听到人们说我需要一个解析器来修改它,这正是AST给我的--已经解析过的代码。但老实说,我认为对源的简单正则化通常足够好;-)
发布于 2015-07-04 17:43:19
首先要澄清的是:运行时元编程意味着有一个自修改程序。它在运行时会改变自己。这通常是通过修改元类来完成的。编译时元编程()意味着在程序运行之前通过“扩展”编译器来修改它。通常,后者是通过AST转换完成的。
Groovy将字节码提供给JVM执行。可能有也可能没有可用的源文件,但通常不存在保存源代码的运行时结构。有一个从meta类到AST的映射,但是这基本上是在类路径上搜索一个合适的源文件,并从中编译一个AST。如果源对您不可用,则此操作无法工作。
即使源代码是可用的,这也不会为您提供所需的修改功能。需要编译一个新类,然后使用诸如热交换之类的方法来替换该类。
Groovy不是像Smalltalk那样的图像系统。
https://stackoverflow.com/questions/31218161
复制相似问题