我有以下代码:
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?
有没有办法使用动态propertyMissing
或getProperty
或类似的东西来实现我想要做的事情?
P.S。我不想在myMethod中执行def variable = ...
或String variable = ...
。我希望myMethod
中的语法保持为variable = ...
,但添加该方法之外的任何内容都是可以接受的。
答案 0 :(得分:11)
您可以上课extend Expando
(Expando 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可以看出,这个手动滚动的版本检查的次数要少得多,而且我更少信任它; - )