scala - 如何使用类型标签/镜像在方法中获取构造函数参数?

标签 scala reflection scala-2.10

对于案例类:

case class MyClass(param1: String, param2: String)

为什么这种反射方法:
import scala.reflect.runtime.universe._
import scala.reflect.runtime.currentMirror
import scala.reflect.runtime.{ universe => ru }

  def getSettings[T](paramObj: T)(implicit tag: TypeTag[T]) {
    val m = ru.runtimeMirror(getClass.getClassLoader)
    val classType = ru.typeOf[T].typeSymbol.asClass
    val cm = m.reflectClass(classType)
    val constructor = tag.tpe.declaration(ru.nme.CONSTRUCTOR).asMethod
    val constructorMethod = cm.reflectConstructor(constructor)
    val args = constructor.asMethod.paramss.head map { p => (p.name.decoded, p.typeSignature) }
    println(args)
 }

当像这样调用时:
scala> getSettings(MyClass)
List()

有那个输出??构造函数不是 2 个参数吗??
我一定在这里遗漏了一些非常明显的东西。该文档并没有涵盖这样的场景。

http://docs.scala-lang.org/overviews/reflection/overview.html

最佳答案

getSettings(MyClass)
MyClass是类 MyClass 的伴生对象.它没有构造函数参数。

你应该像这样重写你的代码:
def getSettings[T]()(implicit tag: TypeTag[T]) {
  ...
}

scala> getSettings[MyClass]
List((param1,String), (param2,String))

关于scala - 如何使用类型标签/镜像在方法中获取构造函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17177427/

相关文章:

scala - 如果它不是整数,如何四舍五入?

php - 如何从特定的 PDO 驱动程序对象中获取所有方法的完整列表?

java - 从调用者获取 ClassLoader 对象

scala - Manifest[T].erasure 在 2.10 中已弃用,我现在应该使用什么?

scala - HList 中的类型类包含元素?

java - playframework - 在自定义选择标签中设置列表参数

java - 从 unwrapped() 获得的 java ArrayList 转换为 Scala 列表

java - 如何检查一个对象是否至少有一个字段不为空?

Scala Play 2.2 应用程序在 Heroku 中部署后崩溃 : target/start No such file or directory

heroku - 如何使用 Scala 2.10 在 heroku 上运行喷射服务器?