스칼라 2.10 리플렉션을 사용하는 경우, this answer은 필요한 것의 절반입니다. . 그것은 당신이 경우 클래스의 방법 기호를 줄 것이다, 그래서 당신은 인수의 순서와 이름을 알고
import scala.reflect.runtime.{universe => ru}
import ru._
def getCaseMethods[T: TypeTag] = typeOf[T].members.collect {
case m: MethodSymbol if m.isCaseAccessor => m
}.toList
case class Person(name: String, age: Int)
getCaseMethods[Person] // -> List(value age, value name)
당신은 해당 메소드 이름을 얻기 위해 이러한 방법에 .name.toString
를 호출 할 수 있습니다.
다음 단계는 주어진 인스턴스에서 이러한 메소드를 호출하는 것입니다.
val p = Person("foo", 33)
val pr = rm.reflect(p)
는 그런 다음
reflectMethod
를 사용하여 각 방법
pr
에 반영
apply
를 통해 그것을 실행할 수 있습니다 당신은 그럼 당신은 "거울"실제 인스턴스 수
val rm = runtimeMirror(getClass.getClassLoader)
에 대한 런타임 거울이 필요합니다. 경우 클래스가 제품 특성을 구현할
def caseMap[T: TypeTag: reflect.ClassTag](instance: T): List[(String, Any)] = {
val im = rm.reflect(instance)
typeOf[T].members.collect {
case m: MethodSymbol if m.isCaseAccessor =>
val name = m.name.toString
val value = im.reflectMethod(m).apply()
(name, value)
} (collection.breakOut)
}
caseMap(p) // -> List(age -> 33, name -> foo)
것은 당신이 제품 방법을 사용할 수 있어야합니다 : 별도로 각 단계를 거치지 않고, 여기에 해결책이 전부입니다 (매개 변수의 값을 추출하는 메커니즘에 대한
val value =
라인 참조) zipwithindex와 함께 productIterator. –