gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:36:29 33 4
gpt4 key购买 nike

我有以下代码:

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 = ...,但在该方法之外添加任何内容都是可以接受的。

最佳答案

你可以让你的类 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 中看到,这个手卷版本做的检查少了很多,我不太相信它 ;-)

关于Groovy:从类方法内部向 groovy 类动态添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7078855/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com