Scala反射

发布时间 2023-07-05 19:06:49作者: jentreywang

Scala

反射

Scala自动为类中的属性提供 get\set 方法

get: fieldname()

set: fieldname_$eq(参数类型)

例如

srcObject: AnyRef = ???
destObject: AnyRef = ???

val srcFields: Array[Field] = srcObject.getClass.getDeclaredFields

for (srcField: Field <- srcFields) {
    Breaks.breakable {
        /*
          Scala自动为类中的属性提供 get\set 方法
           */
        val getSrcFieldName: String = srcField.getName
        val setSrcFieldName: String = s"${getSrcFieldName}_$$eq" // 打印 $ 使用双$转义

        val getMethod: Method = srcObject.getClass.getDeclaredMethod(getSrcFieldName)
        val setMethod: Method = 
          try{
              destObject.getClass.getDeclaredMethod(setSrcFieldName, srcField.getType)
          } catch {
              case ex: Exception => Breaks.break()
          }
    
        val destField: Field =
          try {
          destObject.getClass.getDeclaredField(srcField.getName)
          } catch {
            case ex: Exception => Breaks.break()
          }
        
        if (destField.getModifiers.equals(Modifier.FINAL)) {
          Breaks.break()
        }
        
        setMethod.invoke(destObject, getMethod.invoke(srcObject))

}