首页 文章

Groovy:从类方法内部动态地向groovy类添加属性

提问于
浏览
1

我有以下代码:

class MyClass {
    def myMethod() {
        variable = "I am a variable"
    }

    def propertyMissing(String name) {
        println "Missing property $name"
    }
}

MyClass myClass = new MyClass();
myClass.myProperty
myClass.myMethod();

在myClass.myProperty中, Missing property myProperty 被打印到控制台 .

但是在 myClass.myMethod() 中,groovy并没有尝试去 propertyMissing 而只是抛出一个

groovy.lang.MissingPropertyException: No such property: variable for class: MyClass

一些在线搜索表明这是因为 myClass.myProperty 调用了getter方法,该方法重定向到propertyMissing .

我猜在类方法中,groovy没有通过变量的getter方法,这就是为什么不调用propertyMissing?

有没有办法使用动态 propertyMissinggetProperty 或类似的东西来实现我想要做的事情?

附:我不想在myMethod中执行 def variable = ...String variable = ... . 我希望 myMethod 中的语法将保持为 variable = ... ,但添加该方法之外的任何内容都是可以接受的 .

1 回答

  • 11

    你可以让你的 class extend ExpandoExpando is described here

    class MyClass extends Expando {
        def myMethod() {
            variable = "I am a variable"
        }
    
        def propertyMissing(String name) {
            println "Missing property $name"
        }
    }
    
    MyClass myClass = new MyClass()
    myClass.myProperty
    myClass.myMethod()
    println myClass.variable
    

    您可以通过为变量创建自己的支持映射来手动滚动类似的功能,并自己编写 get/setProperty 方法,即:

    class MyClass {
    
        def myMethod() {
            variable = "I am a variable"
        }
    
        def propertyMissing(String name) {
            println "Missing property $name"
        }
    
        def backingMap = [:]
    
        Object getProperty( String property ) {
          if( backingMap[ property ] == null ) {
            propertyMissing( property )
          }
          else {
            backingMap[ property ]
          }
        }
    
        void setProperty( String property, Object value ) {
          backingMap[ property ] = value
        }
    }
    
    MyClass myClass = new MyClass()
    myClass.myProperty
    myClass.myMethod()
    println myClass.variable
    

    虽然从source code for Expando可以看出,这个手工打印的版本检查的次数要少得多,而且我更少信任它;-)

相关问题