gpt4 book ai didi

Groovy 元编程

转载 作者:行者123 更新时间:2023-12-02 01:36:04 30 4
gpt4 key购买 nike

在 TCL 中,可以在运行时获取方法/过程的代码,对其进行修改并注入(inject)回来。

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

例子:想象下面的(不太好)例子

def someMethod() {
//some complex code I don't have the source
println "debug"
//some more complex code
}

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

感谢 Jayan,我现在知道这可以通过 AST 转换来处理,但在我看来它比应该的更复杂。

如果我可以通过元编程获取源代码并修改它...

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

最佳答案

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

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

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

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

关于Groovy 元编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31218161/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com