首页 > 解决方案 > 如何反映scala类实例?

问题描述

假设以下代码:

package my.package

case class ExampleCaseClass(s: String, i: Int, ...)
object ExampleCaseClass {
  val instance = ExampleCaseClass("number", 5, ...)
}

my.package.ExampleCaseClass.instance如果唯一的引用是一个字符串,比如说或类似的东西,我如何使用 Scala 反射提取类信息和数据?

换句话说,我想要一个功能getInfo: String => String,比如说,以下内容:

getInfo("my.package.ExampleCaseClass.instance") =
  "ExampleCaseClass ( s: number, i: 5, ... )"

标签: scalareflection

解决方案


这使用Java Class.forName

def getInfo(className: String = "finnova.bpf.report.entity.DocumentBarcode") = { 
  val fields =
  Class.forName(className).getDeclaredFields
    .map(f => s"${f.getName}: ${f.getType.getSimpleName}")
    .mkString("(", ", ", ")")
  s"$className$fields"
}

这使用scala.reflect

import scala.reflect._

def getInfo(className: String = "finnova.bpf.report.entity.DocumentBarcode") = { 
  val classSymbol = runtime.currentMirror.classSymbol(Class.forName(className))
  val primCtor = classSymbol.info.decls.find(m => m.isMethod && m.asMethod.isPrimaryConstructor).get
  val fields = primCtor.typeSignature.paramLists.head
  .map(f => s"${f.name}: ${f.info.resultType}").mkString("(", ", ",")")

  s"$className$fields"
}

这涉及更多,但您会获得更多信息。这是一个不错的博客,可以帮助您入门:https ://medium.com/@giposse/scala-reflection-d835832ed13a


推荐阅读