如何在groovy中动态添加属性到实例

时间:2012-04-11 13:08:19

标签: grails properties groovy

我有一段代码如下

def revisedSections=sections.collect{sectionObj->
  sectionObj.questionCategories=sectionObj.questionCategories.collect{qCat->
    def flag=false
    this.questionSet.questions = this.questionSet.questions.collect{qObj->
      if(qCat.category == qObj.questionCategory.category){
        qCat.questions.add(qObj)
        //this.questionSet.questions.remove(qObj)
        flag=true
      }
      qObj
    }
    if(flag){
      qCat
    }
  }
  sectionObj
}
log.debug('revisedSections'+revisedSections)
this.metaClass.getSectionsData={-> revisedSections }
log.debug 'this.sectionsData '+this.sectionsData 

我想将sectionsData属性添加到实例,然后将实例转换为json 但我无法使用此代码访问动态添加的属性,是否有我缺少的东西?

2 个答案:

答案 0 :(得分:0)

您可以使用mixins来完成您正在寻找的内容。像下面这样的东西是本机的和可接受的Groovy:

class RevisedSection {
    String sectionData
}

class Section {
    String name
}

Section.mixin RevisedSection

def section = new Section(sectionData: "Data", name: "Section Name")

assert section.sectionData == "Data"

希望这有帮助!

答案 1 :(得分:0)

如果我理解你想要正确实现的目标,那么使用元编程很容易实现,它应该可行。

如果没有关于代码上下文的信息,我只能猜测对象的基类等,所以这里有一些代码在groovy控制台中运行,完美运行

class D {
 int someValue

 def init() {
  this.metaClass.getSomeString={->someValue as String}
 }
}
def d=new D()
d.init()
d.someValue=76
println d.someString

结果当然是字符串'76'被打印到控制台。

另一个建议,使用静态编译的getter:

class D {
  private Closure computation
  int someValue

 def init() {
  this.computation={someValue}
 }
 String  getSomeString(){
     computation() as String
 }
}