packagecom.gmei.libimportscala.reflect.runtime.universe._/** * Abstract class for parameter case classes. * This overrides the [[toString]] method to print all case class fields by name and value. * @tparam T Concrete parameter class. */abstractclassAbstractParams[T:TypeTag]{privatedeftag:TypeTag[T]=typeTag[T]/** * Finds all case class fields in concrete class instance, and outputs them in JSON-style format: * { * [field name]:\t[field value]\n * [field name]:\t[field value]\n * ... * } */overridedeftoString:String={valtpe=tag.tpevalallAccessors=tpe.decls.collect{casem:MethodSymbolifm.isCaseAccessor=>m}valmirror=runtimeMirror(getClass.getClassLoader)valinstanceMirror=mirror.reflect(this)allAccessors.map{f=>valparamName=f.name.toStringvalfieldMirror=instanceMirror.reflectField(f)valparamValue=fieldMirror.gets" $paramName:\t$paramValue"}.mkString("{\n",",\n","\n}")}}