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的原创文章,请关注公众号"汪子熙":
相关文章
- js中Blob基本用法
- java中Calender类的详细用法(详解)
- Java中继承的详细用法
- python list中append()与extend()用法
- Python内置函数reversed()用法分析
- js的insertRow和insertCell用法
- SCP 和 rsync限速以及用法
- ML之xgboost:解读用法之xgboost库的core.py文件中的get_score(importance_type=self.importance_type)方法
- UpdatePanel的用法
- Android TextureView 与 SurfaceView用法区别
- ::before和::after伪元素的用法
- C# 线程池ThreadPool的用法简析