scala反射:将符号与给定值匹配

时间:2015-10-02 00:10:42

标签: scala reflection

我正在尝试将类构造函数(来自备选方案集)与从解析某些DSL检索到的值列表进行匹配。由于这些值是异构的,我将它们存储在Array[Any]

我正在使用以下代码来执行此操作:

val myClassSymbol: ru.ClassSymbol = mirror.classSymbol(Class.forName(myClassName))
    val cm: ru.ClassMirror = mirror.reflectClass(myClassSymbol)
    val ctor = myClassSymbol.primaryConstructor.alternatives find { c =>
      val signature: ru.Type = c.typeSignature
      val constructorParams = signature.paramLists.flatten
      val constructorParamValues: Seq[Any] = resultOfMyParsing
      (constructorParamValues.size == constructorParams.size) && ((constructorParams zip constructorParamValues) forall ((pair: (ru.Symbol, Any)) => {
        val sym = pair._1
        var param = pair._2
        ??? // something to match the symbol with the value
      }))
    }
 ctor map {c =>
      val ctorm = cm.reflectConstructor(ctor.get.asMethod)
      ctorm(resultOfMyParsing: _*)
    } getOrElse {
      throw new IllegalStateException(s"cannot find ctor for $constructorParamValues") // might be relace with some clever logic as a fallback
    }

有谁知道如何更换???用? (或者提出一个更好/更简单的解决方案)

非常感谢提前!

1 个答案:

答案 0 :(得分:0)

我认为你能做的最好的事情就是比较类(由于类型擦除):

val clazz = mirror.runtimeClass(sym.asTerm.typeSignature)
clazz.isInstance(param)

如果要处理名称构造函数参数,则需要稍微修改一下。