从数组的参数创建案例类

时间:2018-12-21 20:06:01

标签: arrays scala case-class

我有一个字符串数组:EmpArray = Array(emp_id,emp_name,city)

不是手动创建案例类(例如-case Class Emp (val emp_id: String, val emp_name:String, val city:String)

我可以从数组本身创建一个案例类吗?

case class Emp (EmpArray(0), EmpArray(1), EmpArray(2)) -- //hypothetical

在scala中可以进行任何此类事情吗?

1 个答案:

答案 0 :(得分:1)

如果确实需要,则可以通过运行时编译来实现:

import scala.reflect.runtime.universe
import scala.tools.reflect.ToolBox

def compileCaseClass(name: String, values: (String, String)*): Class[_] = {
  val tb = universe.runtimeMirror(getClass.getClassLoader).mkToolBox()
  val code = s"""
    |case class $name(${values.map{case (n, t) => n + ": " + t}.mkString(",")})
    |scala.reflect.classTag[$name].runtimeClass
  """.stripMargin
  println(code)
  tb.compile(tb.parse(code))().asInstanceOf[Class[_]]
}

用法示例:

val arr = Array("emp_id", "emp_name", "city")
val types = Array.fill(3){"String"}
val emp = compileCaseClass("Emp", (arr zip types): _*)
val inst = emp.getConstructors.head.newInstance("foo", "bar", "baz")
println(inst)

它确实输出案例类实例的常规toString

Emp(foo,bar,baz)

请注意,它需要反射/编译器工具箱作为依赖项:如果您在REPL中以脚本或脚本的形式运行它,就可以使用它,但是在普通项目中,您必须将其添加为单独的依赖项。