且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Groovy里的setProperty和getProperty重载用法

更新时间:2022-09-10 19:23:01

例子:

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方法返回。Groovy里的setProperty和getProperty重载用法属性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);
}

Groovy里的setProperty和getProperty重载用法而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

Groovy里的setProperty和getProperty重载用法