首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy的ExpandoMetaClass范围?

Groovy的ExpandoMetaClass范围?
EN

Stack Overflow用户
提问于 2013-11-06 19:32:07
回答 1查看 751关注 0票数 7

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

代码语言:javascript
复制
public class Fizz {
    // ...etc.
}

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

这相当于将Fizz类重构为:

代码语言:javascript
复制
public class Fizz {
    // ctors, getters/setters, etc...

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

我的问题是:

这是否只将doStuff(String blah) Fizz**?的添加到Fizz**?的特定实例中?或者** Fizz 的所有实例现在都有 doStuff(String blah) 实例方法吗?

如果是前者,如何使Fizz的所有实例都具有doStuff实例方法?我知道,如果我创建了Groovy:

代码语言:javascript
复制
fizz.metaClass.doStuff << { String blah -> fizz.buzz(blah) }

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-06 20:50:08

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

因此,处理这个问题的一种方法是使用来自原始类的方法签名。因此,而不是

fizz.doStuff(blah)

调用类的方法。因此

fizz.&doStuff(blah)

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

现在,向外推到每个实例的另一种选择是使Fizz的实例ExpandoMetaClass实例。因此..。

代码语言:javascript
复制
Fizz.metaClass.doStuff = {return "blah"}
fizz = new Fizz()
Fizz.metaClass.doOtherStuff = {return "more blah"}
assert fizz.doOtherStuff() == "more blah"

希望这能有所帮助

更新:

完整代码示例:

代码语言:javascript
复制
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"
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19821122

复制
相关文章

相似问题

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