Я хотел реализовать функционально, что позволяет добавлять неизвестные свойства классу во время попытки установить его без использования динамических свойств map
.странное поведение при добавлении свойства внутри propertyMissing метод
Как Groovy позволяет это сделать с помощью metaClass
Я использовал его в методе propertyMissing
.
class Item {
def propertyMissing(String name, value) {
this.class.metaClass."$name" = value
}
}
Но я столкнулся с странным поведением.
def i1 = new Item()
i1.prop = "value"
println i1.properties // [class:class Item]
println i1.prop // null
i1.metaClass.field = "555"
println i1.properties // [prop:null, class:class Item, field:555]
println i1.prop // null
i1.prop = "value1"
println i1.properties // [prop:value1, class:class Item, field:555]
println i1.prop // value1
Кроме того, если я достигаю metaClass
, прежде чем пытаться установить prop
в примере он не будет его больше добавлять
def i1 = new Item()
i1.metaClass.unkn = "1111"
i1.prop = "value"
println i1.properties // [class:class Item, unkn:1111]
println i1.prop // null
i1.metaClass.field = "555"
println i1.properties // [class:class Item, unkn:1111, field:555]
println i1.prop // null
i1.prop = "value1"
println i1.properties // [class:class Item, unkn:1111, field:555]
println i1.prop // null
Почему это имеет такое поведение?
О, я вижу. Я полностью упустил из виду, что исключение имеет MetaClassImpl. Я просто видел MissingPropertyException и не смотрел дальше ... – lapots