使用ExpandoMetaClass静态方法可以动态添加,我如何在Singleton对象中使用此ExpandoMetaClass,其中包含重载的静态函数,假设示例程序需要使用ExpandoMetaClass重写,需要在下面的程序中进行更改< / p>
@Singleton
class testA {
def static zMap = [:]
static def X() {
Y()
}
static def Y() {
}
static def X(def var) {
Y(var)
}
static def Y(def var) {
zMap.put(var)
}
}
答案 0 :(得分:2)
使用单例的一个原因是避免在类中使用静态和方法。如果您使用@Singleton
,则没有理由拥有静态方法或字段。使用单例的方法是这样的:
@Singleton class TestA {
def someField = "hello"
def methodX() {
someField
}
}
println TestA.instance.methodX()
您可以使用ExpandoMetaClass扩展单例,如下所示:
TestA.instance.metaClass.newMethod = { -> "foo" }
TestA.instance.metaClass.methodX = { -> "goodbye" }
println TestA.instance.newMethod()
println TestA.instance.methodX()
如果真的想要一个静态方法,你可以这样做:
TestA.metaClass.static.methodY = { -> "I am static" }
println TestA.methodY()
请注意,如果覆盖类metaClass而不是实例metaClass,则在实例已创建的情况下,它将不会应用于实例。为了解决这个问题,请使用@Singleton(lazy = true)
并在访问实例之前覆盖metaClass。