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

use*_*831 1 groovy properties

我有以下代码:

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();
Run Code Online (Sandbox Code Playgroud)

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

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

groovy.lang.MissingPropertyException: No such property: variable for class: MyClass
Run Code Online (Sandbox Code Playgroud)

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

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

有没有办法用动态propertyMissing,或者getProperty类似的东西来实现我想做的事情?

PS我不想做def variable = ...String variable = ...在myMethod.我希望其中的语法myMethod保持不变variable = ...,但添加该方法之外的任何内容都是可以接受的.

tim*_*tes 11

你可以上课extend Expando(这里描述的是Expando)

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
Run Code Online (Sandbox Code Playgroud)

您可以通过为变量创建自己的支持映射并自行编写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
Run Code Online (Sandbox Code Playgroud)

虽然正如你从Expando源代码中看到的那样,这个手动滚动版本的检查要少得多,而且我更少信任它;-)