3
가 나는 다음과 같은 클래스가 말 값 :생성자 매개 변수의지도에서 클래스 인스턴스를 만들기
case class Mock(id: Int, pty1: String, pty2: String)
나는 동적으로 다음지도에서 인스턴스화 할 수 있습니까?
val params = Map("id" → 234, "pty1" → "asdf", "pty2" → "asdf")
가 나는 다음과 같은 클래스가 말 값 :생성자 매개 변수의지도에서 클래스 인스턴스를 만들기
case class Mock(id: Int, pty1: String, pty2: String)
나는 동적으로 다음지도에서 인스턴스화 할 수 있습니까?
val params = Map("id" → 234, "pty1" → "asdf", "pty2" → "asdf")
LOL) 이미 내 lib에 구현 된 해결책이 있음을 알았습니다. 스칼라 2.10이 필요합니다. 매개 변수의 이름이 바이트 코드의 일부가 아닌 및 실행시 그 때문에이 문자열 인수 알 수있는 방법이 먼저입니다 어느 이후
def instantiate[T <: AnyRef : Manifest](params: Map[String, Any]): T = {
instantiate(Mirror.classToType(manifest[T].erasure), params).asInstanceOf[T]
}
def instantiate(tpe: Mirror.Type, params: Map[String, Any]) = {
val p = constructorParams(tpe, params)
require(
params.size == p.size &&
p.forall(p => params.contains(p.nameString)),
"Params map `" + params + "` doesn't match `" + p + "`"
)
Option(Mirror.typeToJavaClass(tpe).getConstructor(p.map(p => Mirror.typeToJavaClass(p.tpe)): _*))
.getOrElse(throw new RuntimeException("No appropriate constructor of `" + tpe + "` found"))
.newInstance(p.map(p => params(p.nameString).asInstanceOf[Object]): _*)
}
private def constructorParams(tpe: Mirror.Type, params: Map[String, Any]) = {
tpe.members.find(_.isConstructor).get.paramss(0)
}
는 I는 determistic 방법으로 당신이 할 수 있다고 생각하지 않습니다 둘째.
스칼라의 어떤 버전에서 작동합니까? –
"스칼라 2.10 필요" –