使用映射初始化时,无法为groovy中的类设置只读属性:class

使用映射初始化时,无法为groovy中的类设置只读属性:class,groovy,Groovy,我试图创建一个类并用默认值初始化所有值。我在groovy中有这个pojo,我创建了initializeWithDefaults方法来初始化所有的值。我试图在构造函数中传递map class MDS { String id String mdsName String name String mdsType String mdsContext String mdsDateTime String mdsDomain public sta

我试图创建一个类并用默认值初始化所有值。我在groovy中有这个pojo,我创建了initializeWithDefaults方法来初始化所有的值。我试图在构造函数中传递map

class MDS {
    String id
    String mdsName
    String name
    String mdsType
    String mdsContext
    String mdsDateTime
    String mdsDomain

    public static void initializeWithDefaults() {
        MDS dataSegmentIdDef = new MDS()
        Map<String, Object> prop = dataSegmentIdDef.properties
        prop.each { Map.Entry entry->
            entry.value = "default-${entry.key}"
        }

        MDS dataSegmentId = new MDS(prop)

    }
}

一个快速修复方法是使用
findAll
方法过滤掉已经有值的属性

public static void initializeWithDefaults() {
    MDS dataSegmentIdDef = new MDS()
    Map<String, Object> prop = dataSegmentIdDef.properties.findAll { !it.value }
    prop.each { Map.Entry entry->
        entry.value = "default-${entry.key}"
    }

    MDS dataSegmentId = new MDS(prop)
}

当您试图重写作为
getClass()
提供的
HashMap
class
属性时,就会出现错误

您应该注意,您要复制哪些属性。Groovy控制台中的一个简单实验如下(请注意
!prop.synthetic
):

以及输出:

Result: default.id:default.mdsName:default.mdsDomain

为什么不跳过“class”属性呢
if(entry.key!='class')entry.value=“default-${entry.key}”
yeah最后只是这样做了,当时正在考虑避免这种情况的方法,或者可能有更好的方法来实现我的目标
    Map<String, Object> prop = dataSegmentIdDef.properties
            .findAll { !it.value }
            .collectEntries { key, noValue -> [key, "default-$key"] }    
class MDS {
  // your props

  @Override
  String toString() {
    "$id:$mdsName:$mdsDomain"
  }

  static void initializeWithDefaults() {
    MDS mds = MDS.class.declaredFields.inject( new MDS() ){ MDS mds, prop ->
      if( !prop.synthetic ) mds[ prop.name ] = "default.$prop.name"
      mds
    }
    println mds
  }
}

MDS.initializeWithDefaults()
Result: default.id:default.mdsName:default.mdsDomain