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

Grails 如何在groovy中向实例动态添加属性,grails,properties,groovy,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(qC

我有一段代码如下

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
但是我无法使用此代码访问动态添加的属性,是否缺少某些内容?

您可以使用mixin来完成所需的内容。类似于以下内容的内容是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"

希望这有帮助

如果我正确理解了您要实现的目标,那么元编程很容易实现,而且应该可以实现

如果没有关于代码上下文的信息,我只能猜测对象的基类等,因此下面是一些在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
 }
}

您是否有一个可以执行的示例来展示您所说的问题?很抱歉,我无法共享完整的代码,但我会尝试解释什么是场景……我有一个类,我不能修改它,我想在它的实例中添加一个属性,这样当我将实例转换为json时,它将有一个自定义属性供客户端使用……这里我有一个名为“ReviedSections”的集合我想将其作为自定义属性添加到实例中…难道不可能像这样分配集合吗?我不是在寻找完整的代码,只是一个显示您正在尝试执行的可执行示例,因为我不理解这个问题……哦……实际上,我没有记录日志,而是尝试打印新添加的属性,它实际上打印了增加的值……所以我认为问题在于json转换……有没有办法制作json转换器(我使用的是grails的默认json转换器)转换此自定义属性?@tim_yates感谢您查看此内容…抱歉不清楚…感谢您的回复…事实上我已经解决了问题。问题在于json转换…grails的默认json转换器不会将动态添加的属性转换为json,您知道实现这一点的方法吗?可以将模型的对象表示形式更改为转换为映射,然后将属性作为键添加到映射中。另外值得一试的是将方法添加到类元类,而不是实例?也许这是JSON的结果。第三件应该起作用的事情是创建一个方法getXXX(){xxxClosure()},它委托给一个闭包xxxClosure,然后由yout init block分配。是的,这个方法肯定不会起作用,因为元类属性永远不会被序列化。此外,提供的示例缺少正确的类型和setter方法。mixin会被序列化吗?另外,我希望在每个实例的基础上添加动态属性,而不是整个类。mixin将不会在每个实例的基础上工作,mixin在编译时添加代码。我非常确定我的第三个建议会起作用。非常感谢您的回复…元编程方法确实起作用..但对于我的用例,我需要将实例转换为json..并希望动态添加的属性转换为json(grails的默认json转换器跳过)你知道有什么方法可以让它转换动态属性吗?