У меня проблема с использованием Java Reflection из Scala. Мой код:
case class MyClass(id: String, value: Double)
def create(values: Map[String, Any]): MyClass = {
val constructor = classOf[MyClass].getConstructors.head
val arguments = classOf[MyClass].getDeclaredFields().map( f => values(f.getName) )
constructor.newInstance(arguments: _*).asInstanceOf[MyClass]
}
create(Map("id" -> "CE0D23A", "value" -> 828.32))
Моя проблема в том, что мне нужно передать карту [String, Any], потому что одно из значений - это Double, но newInstance требует Object, а не Any.
Я пробовал то же самое со вселенной scalas:
case class MyClass(id: String, value: Double)
def create(values: Map[String, Any]): MyClass = {
val m = universe.runtimeMirror(getClass.getClassLoader)
val myClass = universe.typeOf[MyClass].typeSymbol.asClass
val cm = m.reflectClass(myClass)
val ctro = universe.typeOf[MyClass].declaration(universe.nme.CONSTRUCTOR).asMethod
val ctorm = cm.reflectConstructor(ctro)
ctorm(values: _*).asInstanceOf[MyClass]
}
create(Map("id" -> "CE0D23A", "value" -> 828.32))
Проблема здесь в том, что я только представил MyClass для примера. Позже это должна быть общая функция типа def create(values: Map[String, Any]): T
. Но затем я получил следующее исключение: "Нет TypeTag для T"
Есть ли способ преобразовать эти значения?
Спасибо