importscala.reflect.ClassTag
importscala.reflect.runtime.universe._
def checkAndFillNull[T: TypeTag : ClassTag](obj: T): T ={// 获取输入对象的运行时的镜像val mirror = runtimeMirror((obj.getClass.getClassLoader))// 获取类符号val classSymbol = typeOf[T].typeSymbol.asClass
// 获取类镜像val classMirror = mirror.reflectClass(classSymbol)// 获取构造函数符号val constuctorSymbol = typeOf[T].decl(termNames.CONSTRUCTOR).asMethod
// 获取构造函数符号并反射构造函数镜像val constructorMirror = classMirror.reflectConstructor(constuctorSymbol)// 遍历构造函数符号的参数列表val args = constuctorSymbol.paramLists.flatten.map {// 对于每个参数
param =>// 获取参数名称val paramName = param.name.toString
// 获取getter方法符号val getterMethodSymbol = typeOf[T].decl(TermName(paramName)).asMethod
// 反射getter方法镜像val getterMethodMirror = mirror.reflect(obj).reflectMethod(getterMethodSymbol)// 使用getter方法镜像获取字段值val value = getterMethodMirror.apply()// 如果字段值位null, 则根据字段类型使用匹配表达式确定默认值if(value ==null){val default = param.typeSignature match{case t if t =:= typeOf[Boolean]=>falsecase t if t =:= typeOf[Char]=>'\u0000'case t if t =:= typeOf[Byte]=>0.toByte
case t if t =:= typeOf[Short]=>0.toShort
case t if t =:= typeOf[Int]=>0case t if t =:= typeOf[Long]=>0Lcase t if t =:= typeOf[Double]=>0.0case t if t =:= typeOf[Float]=>0.0fcase t if t <:< typeOf[String]=>"default"case t if t <:< typeOf[Option[_]]=> None
case _ => None
}// 将默认值转换为Object类型,添加到参数列表中
default.asInstanceOf[Object]}else{
value.asInstanceOf[Object]}}// 使用构造函数镜像和参数列表创建新对象并返回
constructorMirror(args: _*).asInstanceOf[T]}