gpt4 book ai didi

groovy - 是否可以替换现有对象的常规方法?

转载 作者:行者123 更新时间:2023-12-03 12:16:02 25 4
gpt4 key购买 nike

以下代码试图替换Groovy类中的现有方法:

class A {
void abc() {
println "original"
}
}

x= new A()
x.abc()
A.metaClass.abc={-> println "new" }
x.abc()
A.metaClass.methods.findAll{it.name=="abc"}.each { println "Method $it"}

new A().abc()

结果为以下输出:
original
original
Method org.codehaus.groovy.runtime.metaclass.ClosureMetaMethod@103074e[name: abc params: [] returns: class java.lang.Object owner: class A]
Method public void A.abc()
new

这是否意味着在通过将其设置为闭包来修改元类时,它实际上并没有替代它,而只是添加了它可以调用的另一个方法,从而导致元类具有两个方法?是否有可能真正替代该方法,以便输出的第二行显示“new”?

当试图找出答案时,我发现 DelegatingMetaClass可能会有所帮助-这是最时髦的方法吗?

最佳答案

您可以使用每个实例的metaClass更改现有对象中的值,如下所示:

x= new A()
x.abc()
x.metaClass.abc={-> println "new" }
x.abc()
x.metaClass.methods.findAll{it.name=="abc"}.each { println "Method $it"}

但是正如您所看到的,x将有两个与之关联的方法(实际上,一个方法和您添加的闭包

如果更改A的定义,以使该方法成为闭包定义,如下所示:
class A {
def abc = { ->
println "original"
}
}

然后,您只会在metaClass中获得单个闭包,而在更改后没有任何方法

关于groovy - 是否可以替换现有对象的常规方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2444907/

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