如何反映scala类实例?

时间:2018-10-17 02:56:09

标签: scala reflection

假设以下代码:

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, ... )"

1 个答案:

答案 0 :(得分:1)

这使用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