我有一个实现GroovyInterceptable的类,我认为应该让所有方法调用都通过" invokeMethod'。但我发现事实并非如此。
class Test implements GroovyInterceptable{
String name
@Override
Object invokeMethod(String name, Object args) {
def metaMethod = this.metaClass.getMetaMethod(name, args)
return metaMethod.invoke(this, "BAR")
}
public static void main(String[] args) {
Test.metaClass.NEWATTRIBUTE = null
def test = new Test()
test.NEWATTRIBUTE = "MEOW1"
println test.NEWATTRIBUTE // shouldnt this be BAR ?
test.setNEWATTRIBUTE("MEOW2")
println test.NEWATTRIBUTE // prints 'BAR'
// much simpler example ....
test.name = "MOOO"
println test.name // shouldnt this be BAR ?
test.setName("MOOO")
println test.name // prints 'BAR'
}
}
我想我读到了某个地方,
test.NEWATTRIBUTE = "MEOW1"
并不直接访问该字段。 Groovy仍然会调用setter方法 - 因此invokeMethod应该被调用,不是吗?
由于
亚历
答案 0 :(得分:1)
设置属性时,Groovy会调用setProperty
。将此方法添加到类:
void setProperty(String prop, val) {
System.out.println "set property $prop with $val"
}
答案 1 :(得分:0)
WillP:非常感谢。这是完整的代码:
class Test implements GroovyInterceptable{
String name
@Override
Object invokeMethod(String name, Object args) {
def metaMethod = this.metaClass.getMetaMethod(name, args)
return metaMethod.invoke(this, "BAR")
}
void setProperty(String prop, val) {
getMetaClass().setProperty(this, prop, "BAR2");
}
public static void main(String[] args) {
Test.metaClass.NEWATTRIBUTE = null
def test = new Test()
test.NEWATTRIBUTE = "MEOW1"
println test.NEWATTRIBUTE // prints BAR2
test.setNEWATTRIBUTE("MEOW2")
println test.NEWATTRIBUTE // prints BAR
test.name = "MOOO"
println test.name // prints BAR2
test.setName("MOOO")
println test.name // prints BAR
}
}
事实证明,无论类是否实现setProperty()
,都会调用GroovyInterceptable
。但invokeMethod()
仅在类实现GroovyInterceptable