假设以下代码:
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, ... )"
答案 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