【问题标题】:Groovy Meta-ProgrammingGroovy 元编程
【发布时间】:2015-09-21 23:10:29
【问题描述】:

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

【问题讨论】:

  • @Jayan Thanx。这些资源仅向我展示了 AST 可用于元编程,而不是源。但是,如果可以将 AST 转换回源,请对其进行修改并注入......
  • 您可以为方法提供全新的实现。看来您想阅读“方法源”,然后通过更改 AST 来更改它。这也应该是可能的;请用更好的例子改进你的问题,很快就会有一些好的答案(来自其他人)
  • 试图改善我的问题:-)

标签: groovy metaprogramming


【解决方案1】:

首先澄清一下: 运行时元编程意味着拥有一个自我修改的程序。它在运行时会自行改变。这通常通过修改元类来完成。编译时元编程意味着通过“扩展”编译器在程序运行之前对其进行修改。通常后者是通过 AST 转换完成的。

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

即使源可用,这也不会为您提供所需的修改功能。需要编译一个新类,然后使用诸如热交换之类的方法来替换该类。

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

【讨论】:

  • 谢谢!我想这就是我一直在寻找的答案。提问的时候没有想到运行时间和编译时间的区别……
猜你喜欢
  • 2010-10-14
  • 1970-01-01
  • 2011-06-28
  • 2011-02-21
  • 2017-03-19
  • 2013-07-01
  • 2010-11-30
相关资源
最近更新 更多