首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy元编程

Groovy元编程
EN

Stack Overflow用户
提问于 2015-07-04 07:30:03
回答 1查看 194关注 0票数 3

在TCL中,可以在运行时获取方法/过程的代码,修改它并将其注入回。

这在Groovy中是可能的吗?我知道包装原始方法是可能的,但我(不幸地)猜测,在groovy中,方法的来源在运行时是不可用的,是吗?

试想一下下面的例子(不太好)

代码语言:javascript
复制
def someMethod() {
   //some complex code I don't have the source
   println "debug"
   //some more complex code
}

如果我现在想将println语句更改为log语句。我无法替换整个方法,因为我要么没有源代码,要么不想冒险在下一个版本中它是不同的,因此我会用旧的源代码覆盖它。

感谢Jayan,我现在意识到这可以通过AST转换来处理,但在我看来,它比应该的要复杂得多。

如果我能通过元编程得到源代码并修改它.

好的--我已经听到人们说我需要一个解析器来修改它,这正是AST给我的--已经解析过的代码。但老实说,我认为对源的简单正则化通常足够好;-)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-04 17:43:19

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

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31218161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档