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: " + 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方法返回。image.png属性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);
}

image.png而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

image.png

相关文章
|
8天前
|
Java
Properties类的使用
本文介绍了Java中Properties类的使用,它继承自Hashtable,用于处理属性文件。Properties对象可以保存键值对,并且能够从输入流加载或保存到输出流。文章展示了如何读取和写入properties文件,包括使用`setProperty`和`getProperty`方法来设置和获取属性值,以及使用`list`方法打印属性到控制台。同时,还解释了Properties类底层使用的哈希表结构,并提到了字符编码转换问题,特别是在处理中文时会转换成unicode编码。
|
3月前
|
Java Go C#
proto转java类时相关option配置
proto转java类时相关option配置
31 0
|
5月前
|
Java
【Java代码】反射机制处理传递给mapper文件的非Map类型参数对象(指定属性为空则设置默认值)
【Java代码】反射机制处理传递给mapper文件的非Map类型参数对象(指定属性为空则设置默认值)
48 0
【错误记录】Groovy 函数参数动态类型报错 ( Caught: groovy.lang.MissingMethodException: No signature of method )
【错误记录】Groovy 函数参数动态类型报错 ( Caught: groovy.lang.MissingMethodException: No signature of method )
2873 0
【错误记录】Groovy 函数参数动态类型报错 ( Caught: groovy.lang.MissingMethodException: No signature of method )
|
Java
java的idea快捷键生成getter和setter、有构造参数、无构造参数、重写toString方法
java:在使用idea时候会遇到使用快捷键 java的idea快捷键生成getter和setter、有构造参数、无构造参数时候,可以按照我的方法中英文对照着来操作即可
384 0
java的idea快捷键生成getter和setter、有构造参数、无构造参数、重写toString方法
|
Java
62 getproperty对象
62 getproperty对象
67 0
62 getproperty对象
|
Java
将JDK动态代理生成的类保存为 .class文件System.setProperty(“sun.misc.ProxyGenerator.saveGeneratedFiles“, “true“)无效
将JDK动态代理生成的类保存为 .class文件System.setProperty(“sun.misc.ProxyGenerator.saveGeneratedFiles“, “true“)无效
760 0
将JDK动态代理生成的类保存为 .class文件System.setProperty(“sun.misc.ProxyGenerator.saveGeneratedFiles“, “true“)无效
|
Java
【Groovy】Groovy 方法调用 ( Java 类成员及 setter 和 getter 方法设置 | Groovy 类自动生成成员的 getter 和 setter 方法 )
【Groovy】Groovy 方法调用 ( Java 类成员及 setter 和 getter 方法设置 | Groovy 类自动生成成员的 getter 和 setter 方法 )
545 0
【Groovy】Groovy 方法调用 ( Java 类成员及 setter 和 getter 方法设置 | Groovy 类自动生成成员的 getter 和 setter 方法 )
|
SQL Java 测试技术
源码分析 There is no getter for property named '*' in 'class java.lang.String(1)
源码分析 There is no getter for property named '*' in 'class java.lang.String
465 0
源码分析 There is no getter for property named '*' in 'class java.lang.String(1)