2016-10-20 18 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基本特征的方法。

尝试使用这样的方法签名:

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

但是它仍然不会为内壳类工作(fields还报告$outer已场内,这productElement将不会返回,所以它崩溃与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

很好。我尝试使用反映很多次,但失败了。 –