Groovy里的setProperty和getProperty重载用法
生活随笔
收集整理的這篇文章主要介紹了
Groovy里的setProperty和getProperty重载用法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
例子:
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: " + namereturn metaClass.getProperty(this, name)}elsereturn 'dedicated branch for field3'}}def someGroovyClass = new SomeGroovyClass()println someGroovyClass.field1println someGroovyClass.field2 println someGroovyClass.field3 println someGroovyClass.field4POGO里沒有顯式定義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 propertyString bvoid 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.propertyprintln pogo.b無論本例這個POGO中定義的任何屬性被復制時,據被setProperty攔截,值被統一設置為overridden:
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
總結
以上是生活随笔為你收集整理的Groovy里的setProperty和getProperty重载用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Groovy里的运行时元数据编程(met
- 下一篇: 研究机构警告:人工智能的兴起只会让科技巨