scala - 如何反映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, ... )"
解决方案
这使用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
推荐阅读
- github - 使用 github 操作创建拉取请求
- jquery - Laravel 中搜索栏的 ajax Uncaught ReferenceError
- mongodb - MongoDB(猫鼬)可以在 $cond 中进行 $elemMatch 或在部分匹配的对象中进行 $elemMatch 吗?
- css - Flexbox 项目超出其容器
- wordpress - 您如何限制在 WP 上查看的非注册页面数。用户?
- node.js - 为什么 npm start 给我“错误:找不到模块'./keywords'”?
- react-native - 带有反应本机无限循环的firebase实时数据库查询
- java - 使用微调器选择节点
- javascript - 如何在 JavaScript 中将每个句子的第一个单词大写
- c# - 在 C# 中使用 DataPointCollection.DataBindY 绘制股票图表