zl程序教程

您现在的位置是:首页 >  其它

当前栏目

Groovy里的setProperty和getProperty重载用法

用法 重载 Groovy
2023-09-14 09:03:08 时间

例子:

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


无论本例这个POGO中定义的任何属性被复制时,据被setProperty拦截,值被统一设置为overridden:

要获取更多Jerry的原创文章,请关注公众号"汪子熙":