我有以下代码:
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的源代码中看到的那样,这个手动滚动版本的检查要少得多,而且我更少信任它;-)
| 归档时间: |
|
| 查看次数: |
8757 次 |
| 最近记录: |