2016-10-20 3 views
0
case class Keyword(id: Int = 0, words: String) 

val my= Keyword(123, "hello") 

val fields: Array[Field] = my.getClass.getDeclaredFields 

for (i <- fields.indices) { 

    println(fields(i).getName +":"+ my.productElement(i)) 

} 

ID의 경우 클래스의 값을 표시하는 방법 : 123스칼라에

제목 : 키워드의 제목

괜찮아요.

def outputCaseClass[A](obj:A){ 

    val fields: Array[Field] = obj.getClass.getDeclaredFields 

    for (i <- fields.indices) { 

    println(fields(i).getName +":"+ obj.productElement(i)) 

    } 
} 

outputCaseClass(my) 

잘못

+0

케이스 클래스는'그래서 제품 반복자를 사용 product'을 확장합니다 : http://stackoverflow.com/a/17827262/1154145 – nattyddubbs

+0

너무 감사합니다. 하지만이 코드를 함수에 넣으면 작동하지 않습니다. –

+0

누락 된 부분은 귀하의 방법을 작동시키는 데 필요한 'A'의 '암시 적 ClassTag'입니다. –

답변

2

productElement가 Product 자료 특성의 방법입니다. 여전히 내부 케이스 클래스에 대해 작동하지 않습니다 그러나 fields 또한 $outer -Field, productElement 반환하지 않으며, 그래서 충돌보고 (

def outputCaseClass[A <: Product](obj:A){ .. } 

:

시도는이 같은 방법 서명을 사용하는 IndexOutOfBoundsException). 여기에 설명 된대로

+0

감사합니다. 시도해보십시오 def myFunction [A <: Product] (obj : A) = {..} 작품입니다. –

2
import scala.reflect.runtime.{universe => ru} 

def printCaseClassParams[C: scala.reflect.ClassTag](instance: C):Unit = { 
    val runtimeMirror = ru.runtimeMirror(instance.getClass.getClassLoader) 
    val instanceMirror = runtimeMirror.reflect(instance) 
    val tpe = instanceMirror.symbol.toType 

    tpe.members 
    .filter(member => member.asTerm.isCaseAccessor && member.asTerm.isMethod) 
    .map(member => { 
     val term = member.asTerm 
     val termName = term.name.toString 
     val termValue = instanceMirror.reflectField(term).get 
     termName + ":" + termValue 
    }) 
    .toList 
    .reverse 
    .foreach(s => println(s)) 
} 

// Now you can use it with any case classes, 

case class Keyword(id: Int = 0, words: String) 

val my = Keyword(123, "hello") 

printCaseClassParams(my) 
// id:123 
// words:hello 
+0

훌륭합니다. 여러 번 사용하려고했지만 실패했습니다. –