【发布时间】:2014-07-16 12:41:00
【问题描述】:
我在使用 Scala 的 Java 反射时遇到问题。我的代码:
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))
我的问题是,我需要传递一个 Map[String, Any],因为其中一个值是 Double,但 newInstance 需要 Object,而不是 Any。
我对 Scalas Universe 进行了同样的尝试:
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 这样的通用函数。但是后来我得到了以下异常:“T没有可用的TypeTag”
有没有办法转换这些值?
谢谢
【问题讨论】:
标签: java scala reflection scala-java-interop