gpt4 book ai didi

java - Groovy 的 ExpandoMetaClass 的范围?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:45 28 4
gpt4 key购买 nike

Groovy 公开了一个 ExpandoMetaClass这允许您动态地将实例和类方法/属性添加到 POJO。我想用它向我的 Java 类之一添加实例方法:

public class Fizz {
// ...etc.
}

Fizz fizz = new Fizz();
fizz.metaClass.doStuff = { String blah -> fizz.buzz(blah) }

这相当于将 Fizz 类重构为:

public class Fizz {
// ctors, getters/setters, etc...

public void doStuff(String blah) {
buzz(blah);
}
}

我的问题:

这是否仅将 doStuff(String blah) 添加到 Fizz 的这个特定实例?还是 Fizz 的所有实例现在都有一个 doStuff(String blah) 实例方法?

如果是前者,如何让 Fizz 的所有实例都拥有 doStuff 实例方法?我知道如果我制作 Groovy:

fizz.metaClass.doStuff << { String blah -> fizz.buzz(blah) }

然后这将向 Fizz 添加一个静态类方法,例如 Fizz.doStuff(String blah),但这不是我想要的。我只希望 Fizz 的所有实例现在都有一个名为 doStuff 的实例方法。想法?

最佳答案

首先,当你添加到 Fizz 的主类时,它的实例不会获取方法,因为实例已经被分解并添加到内存中。

因此,解决此问题的一种方法是使用原始类中的方法签名。因此,而不是

fizz.doStuff(blah)

调用类的方法。因此

fizz.&doStuff(blah)

这从原始类获取方法签名,但使用实例的属性。然而正如您所想象的那样,由于它调用的是原始类,所以这是一个稍微繁重的调用。

现在,向每个实例推送的另一种方法是使实例 ExpandoMetaClass 成为 Fizz 的实例。因此...

Fizz.metaClass.doStuff = {return "blah"}
fizz = new Fizz()
Fizz.metaClass.doOtherStuff = {return "more blah"}
assert fizz.doOtherStuff() == "more blah"

希望对你有帮助

更新:

完整代码示例:

class Fizz{
}

Fizz.metaClass.doOtherStuff = {return "more blah"}
def fizz = new Fizz()
assert fizz.doOtherStuff() == "more blah"

def fizz1 = new Fizz()
assert fizz1.doOtherStuff() == "more blah"

关于java - Groovy 的 ExpandoMetaClass 的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19821122/

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