例子:
package jerry; class SomeGroovyClass { def property1 = 'ha' def field2 = 'ho' def field4 = 'hu' def getField1() { return 'in getField1 dedicated method: getHa' } def getProperty(String name) { if (name != 'field3') { println "prepare to call metaClass for property: " + name return metaClass.getProperty(this, name) } else return 'dedicated branch for field3' } } def someGroovyClass = new SomeGroovyClass() println someGroovyClass.field1 println someGroovyClass.field2 println someGroovyClass.field3 println someGroovyClass.field4
POGO里没有显式定义field1, 然而鼠标hover在field1上时,IDE自动提示其值可以通过getField1方法返回。属性field2和field4在POGO里显式定义,而field3同field1不同,其值通过一个override的generic hook方法getProperty返回,这个getProperty原本也定义在接口GroovyObject里:
package groovy.lang; public interface GroovyObject { Object invokeMethod(String name, Object args); Object getProperty(String propertyName); void setProperty(String propertyName, Object newValue); MetaClass getMetaClass(); void setMetaClass(MetaClass metaClass); }
而POGO的setProperty也是可以拦截(intercept)的:
package jerry; class POGO { String property String b void setProperty(String name, Object value) { println "in setProperty, name:$name, value: $value" this.@"$name" = 'overridden' } } def pogo = new POGO() pogo.property = 'a' pogo.b = 'c' println pogo.property println pogo.b