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**?的特定实例中?或者** Fizz 的所有实例现在都有 doStuff(String blah) 实例方法吗?
如果是前者,如何使Fizz的所有实例都具有doStuff实例方法?我知道,如果我创建了Groovy:
fizz.metaClass.doStuff << { String blah -> fizz.buzz(blah) }然后,这将向Fizz添加一个静态类方法,例如Fizz.doStuff(String blah),但这不是我想要的。我只希望Fizz的所有实例现在都有一个名为doStuff的实例方法。想法?
发布于 2013-11-06 20:50:08
首先,当您添加到Fizz的主类时,它的实例不会得到方法,因为实例已经被分解出来并添加到内存中。
因此,处理这个问题的一种方法是使用来自原始类的方法签名。因此,而不是
fizz.doStuff(blah)
调用类的方法。因此
fizz.&doStuff(blah)
这将从原始类获取方法签名,但使用来自实例的属性。但是,正如您可以想象的那样,由于它调用了原始类,这是一个稍微繁重的调用。
现在,向外推到每个实例的另一种选择是使Fizz的实例ExpandoMetaClass实例。因此..。
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"https://stackoverflow.com/questions/19821122
复制相似问题