【问题标题】:In scala, use reflection on a case class classtag to find the companion object's apply method在 scala 中,在案例类 classtag 上使用反射来查找伴随对象的 apply 方法
【发布时间】:2024-04-23 17:15:01
【问题描述】:

这与以下问题有关,但由于它涉及一个独特而突出的问题,因此我将其作为后续问题提出:Support generic deserialization from a List[(String, Any)] in Scala

如何使用反射来查找 ClassTag 的伴随对象的方法?具体来说,我正在尝试反射性地调用案例类的伴随对象的apply 方法来构造案例类的实例。

【问题讨论】:

    标签: scala reflection


    【解决方案1】:

    this answer可以帮到你吗?

    这是scalaVersion := "2.11.1"的示例

    import scala.reflect.runtime.{universe => u}
    
    def companionMembers(clazzTag: scala.reflect.ClassTag[_]): u.MemberScope = {
      val runtimeClass = clazzTag.runtimeClass
      val rootMirror = u.runtimeMirror(runtimeClass.getClassLoader)
      val classSymbol = rootMirror.classSymbol(runtimeClass)
      // get the companion here
      classSymbol.companion.typeSignature.members
    }
    
    case class MyClass(value: Int)
    
    val applyMethods =
      companionMembers(scala.reflect.classTag[MyClass])
      .filter { m => m.isMethod && m.name.toString == "apply"}
    
    println(applyMethods)
    

    打印

    Scope{
      case def apply(value: scala.Int): MyClass
    }
    

    【讨论】:

    • 是的,这样的工作正常。我最终使用了private val apply = ctag.runtimeClass.getDeclaredMethods.find(m => "apply".equals(m.getName)).get
    最近更新 更多