0

我有一段代码如下

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,但是我无法使用此代码访问动态添加的属性,我缺少什么吗?

4

2 回答 2

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
 }
}
于 2012-04-11T22:37:41.190 回答
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"

希望这可以帮助!

于 2012-04-11T16:55:44.460 回答